fish `while read` 块直到 stdin 完成,同时 sh/bash 立即计算

问题描述 投票:0回答:1

采用以下 sh/bash 脚本:

{
    echo abc
    sleep 2
    echo def
} | while read f; do
    echo $f "has been piped"
done

该块代表一个在单独的行上缓慢生成输出的命令。对于每行,一旦达到

while
的标准输入,就会启动计算。

如果我们将其翻译为鱼:

begin
    echo abc
    sleep 2
    echo def
end | while read -l f
    echo $f "has been piped"
end

行为意外地改变:两秒钟内没有任何反应,然后我们立即得到两行输出。整个 while 块直到流发送完数据才开始计算。

为什么鱼的行为不同以及如何使其与 sh/bash 相匹配?

bash shell stream pipe fish
1个回答
0
投票

为什么鱼的行为不同以及如何使其与 sh/bash 相匹配?

这是fish的一个限制——它只能同时运行一个脚本。

相比之下,Bash/sh 使用子 shell - 即它分叉另一个进程并让它们在那里运行。这带来了一些主要缺点 - 值得注意的是,变量不能在子 shell 之间共享,并且在某些情况下它们奇怪地隐式(并且在 posixy shell 之间有所不同 - 管道中的最后一个进程是否在单独的子 shell 中运行?)。

长期计划是让鱼获得多线程执行。

您的解决方法是手动启动单独的鱼类处理:

fish -c 'echo abc; sleep 2; echo def' | while read -l f
    echo $f has been piped
end
© www.soinside.com 2019 - 2024. All rights reserved.