使用以下sh/bash脚本:
{
echo abc
sleep 2
echo def
} | while read f; do
echo $f "has been piped"
done
字符串
块表示在单独的行上缓慢生成输出的命令。对于每一行,一旦达到while
的stdin,就会启动计算。
如果我们把它翻译成鱼:
begin
echo abc
sleep 2
echo def
end | while read -l f
echo $f "has been piped"
end
型
行为意外地改变:在两秒钟内什么都没有发生,然后我们立即得到两行输出。整个while块直到流完成发送数据后才开始计算。
为什么鱼的行为不同,你如何使它匹配sh/bash?
1条答案
按热度按时间to94eoyn1#
为什么鱼的行为不同,你如何使它匹配sh/bash?
这是fish的一个限制--它只能同时运行一段脚本。
相反,Bash/sh使用子shell-即它会派生出另一个进程,并让它们在那里运行。这带来了一些主要的缺点-特别是,变量不能在子shell之间共享,并且在某些情况下它们是奇怪的隐式的(并且在posixy shell之间不同-管道中的最后一个进程是否在单独的子shell中运行?).
长期计划是让fish获得多线程执行。
您的解决方法是手动启动单独的fish过程:
字符串