seahawk1986 schrieb:
Es hängt wohl an der Kombination aus Loop und Pipeline/Umleitung und der verwendeten Shell: https://mywiki.wooledge.org/BashFAQ/024
Das Beispiel dort nutzt ja auch eindeutig die Schleife in einer Pipe. Das ist standardmäßig natürlich immer eine Subshell. Die Bash kann über shopt -s lastpipe
so eingestellt werden, dass sie selbst den letzten Befehl in einer Pipeline ausführt. Die ksh
macht das anscheinend sowieso.
Aber der Code im ersten Posting enthält nichts dergleichen. Da wird lediglich die Eingabe umgeleitet. Das führt nicht zu einer neue Subshell, wie man leicht mit meinem Beispiel um die Umleitung ergänzt sehen kann.
Keinesfalls ist diese Aussage wahr:
kB schrieb:
In der Shell ist jede Schleife eine Subshell, da hat seahawk1986 schon recht.
Jedenfalls nicht, ohne zu erwähnen, um welche Shell es sich handelt. Die Manpage der Heirloom (?) Shell behauptet jedenfalls, dass das dort bei Umleitungen passiert:
If a command other than a simple-command (i.e. 'for ...', 'case ...' etc.) is redirected, it is executed in a subshell.
Das ergibt für mich allerdings keinen Sinn, weil eine simple Umleitung gar keine Notwendigkeit für einen separaten Prozess hat - anders als bei einer Pipeline. Anscheinend war das mal so und vermutlich will das (jetzt auch schon lange eingeschlafene) Projekt Heirloom obsolete - nein: "traditionelle" Implementierungen zur Verfügung stellen. http://heirloom.sourceforge.net/
Ich kann mir vorstellen, dass frühe Versionen der sh
eine Subshell bei Umleitungen gestartet haben, weil dann der Dateideskriptor nicht geschlossen werden muss, sondern einfach mit der Shell zusammen stirbt - also Faulheit Optimierung bei der Implementierung.