Der Linux Problem/Fragen-Thread

  • Code
    $ ls
    foo.c
    $ for fname in *.c; do cp "$fname" "bar_$fname"; done
    $ ls
    bar_foo.c foo.c

    Bei mir führt dieser Code offenbar nicht zu einer Endlosschleife. Kann ich mich darauf verlassen, dass "*.c" immer komplett evaluiert wird bevor der Schleifeninhalt ausgeführt wird? Gilt das nur bei Bash oder auch für z.B. sh oder zsh?

    „Zitate von sich selbst in der Signatur sind doof.“ Chrisse, 2009
    „Hmm... mal was aus 2010 reinnehmen“ Chrisse, 2010
    „Ach, wie die Zeit vergeht...“ Chrisse, 2011
    „Bin immernoch dagegen“ Chrisse, 2012
    „Jetzt auch mit 2013“ Chrisse, 2013
    „2021 ich komme“ Chrisse, 2014
    „Ab jetzt wieder länger“ Chrisse, 2015
    „Gut Ding will Weile haben“ Chrisse, 2016
    „Meine Signatur: Öfter geupdated als mein Windows“ Chrisse, 2017
    „Klicken sie weiter, hier gibt es nichts zu lesen“ Chrisse, 2018
    „Dieser Post kann Spuren von Sarkasmus enthalten“ Chrisse, 2019
    „Reinstate Chiaki“ Chrisse, 2020
    „2021 ist eine Coverstory der Moderation und nie passiert!“, Chrisse, 2022

  • Wird nur beim ersten Aufruf gecheckt, da kopfgesteuerte Schleife. Das später im Schleifeninneren geschehene kriegt der Schleifenkopf nicht mit. Damits ne Endlosschleife wird, müsste sie fußgesteuert sein.

  • Hmm ok, die Begriffe kopfgesteuert und fußgesteuert kenne ich zwar nicht, aber das klingt sehr nach einer einmaligen Evaluation am Anfang. Danke!

    „Zitate von sich selbst in der Signatur sind doof.“ Chrisse, 2009
    „Hmm... mal was aus 2010 reinnehmen“ Chrisse, 2010
    „Ach, wie die Zeit vergeht...“ Chrisse, 2011
    „Bin immernoch dagegen“ Chrisse, 2012
    „Jetzt auch mit 2013“ Chrisse, 2013
    „2021 ich komme“ Chrisse, 2014
    „Ab jetzt wieder länger“ Chrisse, 2015
    „Gut Ding will Weile haben“ Chrisse, 2016
    „Meine Signatur: Öfter geupdated als mein Windows“ Chrisse, 2017
    „Klicken sie weiter, hier gibt es nichts zu lesen“ Chrisse, 2018
    „Dieser Post kann Spuren von Sarkasmus enthalten“ Chrisse, 2019
    „Reinstate Chiaki“ Chrisse, 2020
    „2021 ist eine Coverstory der Moderation und nie passiert!“, Chrisse, 2022

  • Hab den Begriff mal in nem Lehrbuch gelesen, aber unser Softwaretechnik-Prof hat alles mit UML gemacht.

    „Zitate von sich selbst in der Signatur sind doof.“ Chrisse, 2009
    „Hmm... mal was aus 2010 reinnehmen“ Chrisse, 2010
    „Ach, wie die Zeit vergeht...“ Chrisse, 2011
    „Bin immernoch dagegen“ Chrisse, 2012
    „Jetzt auch mit 2013“ Chrisse, 2013
    „2021 ich komme“ Chrisse, 2014
    „Ab jetzt wieder länger“ Chrisse, 2015
    „Gut Ding will Weile haben“ Chrisse, 2016
    „Meine Signatur: Öfter geupdated als mein Windows“ Chrisse, 2017
    „Klicken sie weiter, hier gibt es nichts zu lesen“ Chrisse, 2018
    „Dieser Post kann Spuren von Sarkasmus enthalten“ Chrisse, 2019
    „Reinstate Chiaki“ Chrisse, 2020
    „2021 ist eine Coverstory der Moderation und nie passiert!“, Chrisse, 2022

  • Mir ist nicht ganz klar, was es hier für eine Rolle spielen soll, ob die Bedingung am Anfang oder am Ende des Loops ausgeführt wird (wie soll eine fussgesteuerte "for i in x" Schleife überhaupt funktionieren, was ist i in ersten Durchlauf?). Das hier ist viel mehr eine Frage der Ausführungsregeln. Und bei einem For-Loop in der Shell wird das iterierte Set vor dem ersten Durchlauf vollständig evaluiert.

    Um die Frage zu beantworten ob das nur in bash so funktioniert, oder generell: Der POSIX-Standard definiert die For-Schleife wiefolgt:

    Zitat von http://pubs.opengroup.org/onlinepubs/007904875/utilities/xcu_chap02.html#tag_02_09_04_03


    First, the list of words following in shall be expanded to generate a list of items.
    Then, the variable name shall be set to each item, in turn, and the compound-list executed each time.

    Was genau Word-Expression sein können (also der Teil nach dem in, in dem Falle hier die Pathname-Extension *.c), steht hier:
    http://pubs.opengroup.org/onlinepubs/007….html#tag_02_06 bzw den Link folgend hier: http://pubs.opengroup.org/onlinepubs/007….html#tag_02_13

    For-Loop Items können nicht (wie z.B. bei Python, for line in open('words.txt')) lazy generiert werden. Selbst bei sowas wie IFS=$'\n'; for line in $(cat words.txt); do echo $line ; done wartet die Shell bis der Befehl fertig ist und die Datei eingelesen, bevor die Ausgabe beginnt. Das ist anders als z.B. das while-Statement in Shell, wo cat words.txt | while read w ; do echo $w ; done direkt nach der ersten Zeile anfängt zu iterieren - beide Schleifen hier sind kopfgesteuert.

    Zum selber testen, einfach das cat zu einem tail -f umwandeln.

    TLDR: Ja, Shell garantiert dir, dass bei einem for Loop die Word List nur einmal initial evaluiert wird, und danach über jedes Item separat iteriert.

    Einmal editiert, zuletzt von gandro (22. Dezember 2016 um 00:31)

  • Zitat

    wie soll eine fussgesteuerte "for i in x" Schleife überhaupt funktionieren, was ist i in ersten Durchlauf?

    For-Schleifen sind IMMER kopfgesteuert, die Bedingung wird also vor dem ersten Durchlauf gecheckt. Anders sieht es bei fußgesteuerten Do-Loop-Schleifen aus, wo erst einmal durchgeführt und DANN erst die Bedingung gecheckt wird.

  • For-Schleifen sind IMMER kopfgesteuert, die Bedingung wird also vor dem ersten Durchlauf gecheckt. Anders sieht es bei fußgesteuerten Do-Loop-Schleifen aus, wo erst einmal durchgeführt und DANN erst die Bedingung gecheckt wird.


    Ich habe nichts anderes behauptet. Nur ist ob kopf- oder fussgesteuert halt irrelevant, der Unterschied hier ist ob es for- oder while-Schleifen sind. Bei "for" wird die Expression nur einmal komplett evaluiert, bei "while" bei jedem Durchlauf. Beide sind kopfgesteuert.

    Einmal editiert, zuletzt von gandro (22. Dezember 2016 um 00:44)

  • Gibt auch do-while, ist dann fußgesteuert. :P

    Folgendes würde also problemlos einmal durchlaufen:

    PHP
    <?php
    	$x=23;
    	do
    	{
    		irgendwas();
    		nochwas();
    	} while($x==24)
    ?>
  • Hat das mit der for-Schleife nicht eher Expansions- und Evaluations-Reihenfolge-Gründe? Die Bash expandiert doch zunächst *.c zu foo.c und eröffnet folglich die Schleife for fname in foo.c, weil zum Zeitpunkt der Expansion lediglich foo.c existierte. Eine erneute Expansion findet nicht statt.

    • • • – • – – • – –

  • Wie ist es eigentlich mit Linux und Mainboardtausch. Bin am Überlegen ob ich meinen Linuxrechner upgrade. Überlebt der sowas, oder ist es wie bei Windows, dass es mal klappen kann, aber dann doch zuviel quer geht?

  • Bei mir hat es bis jetzt immer geklappt, hatte da nie Probleme. Wo du eventuell nachkonfigurieren musst, wenn du einen Herstellertreiber für deine GraKa verwenden willst und du Onboard-Grafik genutzt hast und jetzt einen anderen Hersteller vom Grafikchip hast.
    Also ich gehe jetzt davon aus, dass du den normalen Distributionskernel deiner Distri verwendest und dir nicht selbst was zusammengebaut hast, dann wäre es komplizierter.


  • Wie ist es eigentlich mit Linux und Mainboardtausch. Bin am Überlegen ob ich meinen Linuxrechner upgrade. Überlebt der sowas, oder ist es wie bei Windows, dass es mal klappen kann, aber dann doch zuviel quer geht?

    Das verkraftet Linux sehr leicht, ist für dich also Problemlos zu machen.

  • Cool. Bisher habe ich keine eigenen Treiber verwendet. Ist nen altes Atom board. Überlege auf was jüngeres tu wechseln. Finde aber bei den aktuellen das preis-leistungsverhältnis zu den ersten core i celerons nicht gut. Muss mal schauen.


  • und dir nicht selbst was zusammengebaut hast, dann wäre es komplizierter.

    Das ist auch nicht wirklich kompliziert. Vor dem Hardware-Tausch macht man zusätzlich den Distro-Kernel im Bootloader startbar, sofern man den eh nicht als Alternative starten kann, was beim Selbstkompilieren des Kernels als Fallback i.d.R. sinnvoll ist. Nach dem Hardwaretausch startet man einmal mit dem Distro-Kernel und baut dann einen zur neuen Hardware passenden Kernel.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!