采用以下 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 相匹配?
为什么鱼的行为不同以及如何使其与 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