给定
cmd='fun(){ echo "$@"; }; fun $(fun $(fun hi))'
炮弹往往需要制作两个叉子才能实现
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
它失败了,但是不能管理整个管道。我想将其用于整个管道,可能将其带到其他shell。
—
PSkocik
只是为了进行完整性检查,您已经
—
Eric Renouf
ksh
安装了吗?当我运行您的代码时,会得到0
我没有安装的任何外壳的信息
@EricRenouf大声笑,是的。它也可以做。;)
—
PSkocik
回答者可能需要阅读stackoverflow.com/questions/14686872。
—
JdeBP '16