shell fish `while read`阻塞,直到stdin完成,而sh/bash立即计算

q5lcpyga  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(97)

使用以下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?

to94eoyn

to94eoyn1#

为什么鱼的行为不同,你如何使它匹配sh/bash?
这是fish的一个限制--它只能同时运行一段脚本。
相反,Bash/sh使用子shell-即它会派生出另一个进程,并让它们在那里运行。这带来了一些主要的缺点-特别是,变量不能在子shell之间共享,并且在某些情况下它们是奇怪的隐式的(并且在posixy shell之间不同-管道中的最后一个进程是否在单独的子shell中运行?).
长期计划是让fish获得多线程执行。
您的解决方法是手动启动单独的fish过程:

fish -c 'echo abc; sleep 2; echo def' | while read -l f
    echo $f has been piped
end

字符串

相关问题