Dieses Shell-Skript verhält sich wie erwartet.Ist eine Pipeline garantiert in einer POSIX-Shell eine Subshell?
trap 'echo exit' EXIT
foo()
{
exit
}
echo begin
foo
echo end
Hier ist der Ausgang.
$ sh foo.sh
begin
exit
Dies zeigt, dass das Skript während der Ausführung von foo
beendet wird.
Jetzt sehen Sie das folgende Skript.
trap 'echo exit' EXIT
foo()
{
exit
}
echo begin
foo | cat
echo end
Der einzige Unterschied besteht darin, dass der Ausgang des foo
in `cat geleitet wird. Jetzt sieht die Ausgabe wie folgt aus. Diese
begin
end
exit
zeigt, dass das Skript nicht beendet, während foo
Ausführung, weil end
gedruckt wird.
Ich glaube, das passiert, weil in bash eine Pipeline verursacht eine Subshell geöffnet werden, so foo | cat
entspricht (foo) | cat
.
Ist dieses Verhalten in einer POSIX-Shell garantiert? Ich konnte im POSIX-Standard unter http://pubs.opengroup.org/onlinepubs/9699919799/ nichts finden, was bedeutet, dass eine Pipeline zu einer Subshell führen muss. Kann jemand bestätigen, ob dieses Verhalten zuverlässig ist?
Ist '(foo)' garantiert 'foo' in einer Subshell in einer POSIX-Shell auszuführen? –
Das ist, was das Zitat oben und [Compound Commands] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04) auf mich zu deuten scheinen. Ich habe nirgends etwas von irgendwelchen Ausnahmen gesehen (und es wäre mir komisch, das zu berücksichtigen). –