与えられた
cmd='fun(){ echo "$@"; }; fun $(fun $(fun hi))'
シェルはそれを実現するために2つのフォークを作る必要がある傾向があります
strace-f(){ strace -f "$@" 2>&1; };
for sh in dash bash zsh ksh; do
printf "$sh\t" ; strace-f $sh -c "$cmd" |grep -e clone -e fork -c;
done
ksh
一度もフォークせずに英雄的に作成する場合を除きます:
dash 2
bash 2
zsh 2
ksh 0
それはどうやって?
編集:
パイプがスローされると、次のようになります。
cmd='fun(){ echo "$@"| echo "$@"; }; fun $(fun $(fun hi))'
出力:
dash 11
bash 10
zsh 5
ksh 3
ただし、パイプライン全体でこれを管理することはできません。パイプライン全体でこれを可能にし、おそらく他のシェルに持ち込みたいと思います。
—
PSkocik
健全性チェックのためだけに、
—
エリックRenouf
ksh
インストールしましたか?私はあなたのコードを実行すると、私が得る0
私がインストールされていない任意のシェルのために
@EricRenouf Lol、そうです。そして、それも同様に行います。;)
—
PSkocik
回答者はstackoverflow.com/questions/14686872を読みたいかもしれません。
—
-JdeBP