該shell腳本的行爲與預期相同。管道是否保證在任何POSIX shell中創建子shell?
trap 'echo exit' EXIT
foo()
{
exit
}
echo begin
foo
echo end
這是輸出。
$ sh foo.sh
begin
exit
這表明腳本在執行foo
時退出。
現在看到下面的腳本。
trap 'echo exit' EXIT
foo()
{
exit
}
echo begin
foo | cat
echo end
這裏唯一的區別是foo
的輸出被輸入到cat中。現在輸出如下所示。
begin
end
exit
這表明,在執行foo
因爲end
被印刷在腳本不退出。
我相信會發生這種情況,因爲在bash中,管道會導致子shell被打開,所以foo | cat
等於(foo) | cat
。
在任何POSIX shell中保證這種行爲?我在http://pubs.opengroup.org/onlinepubs/9699919799/找不到POSIX標準中的任何內容,這意味着管道必須導致子外殼。有人可以確認這種行爲是否可以依賴嗎?
'(foo)'保證在任何POSIX shell的子shell中執行'foo'嗎? –
這就是上面的引用和[複合命令](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04)似乎向我指出的。我沒有看到有關任何地方的任何例外情況(對於我來說,這似乎很奇怪)。 –