这是我的构造(只是一个例子):
echo -e "hello: [$(cat file.txt)]"
在 90% 的情况下它工作正常并输出(foo
在 file.txt
中):
hello: [foo]
但在 10% 的情况下我看到(我不知道它发生的时间和原因):
hello: []
foo
为什么会这样?
附言。实际上我的代码是这样的:
STDERR=$(mktemp /tmp/bash-XXXX);
{ something } 2> >( tail -100 | tee $STDERR );
CODE=$?;
if [ $CODE != 0 ]; then
echo -e "ERROR ${CODE}: \"$(cat ${STDERR})\"";
fi
rm -f ${STDERR}
最佳答案
这里出现了竞争条件。
tail -100 | tee $STDERR
已创建,但很可能在 fifo 上休眠(因为那时它仍然是空的)。您的程序写入 fifo('something')但 fifo 有缓冲区,因此它写入所有内容并继续。然后在某个不确定的时间唤醒尾部/发球台 - 有时为时已晚:这意味着当 cat 读取它时 $STDERR 仍然是空的。
如何解决:您无法在 tee/tail 完成时轻松同步。使用
{ something; } 2>&1 | tail ... | tee
您需要其他方式来电报$?从{某事}。我会回来的。
一种方法是,设置
设置-o管道失败
这样管道中的每个失败组件都会设置管道的退出状态。
另一种方法是查询数组 PIPESTATUS(请参阅 bash(1))。
希望对你有帮助
关于linux - echo 在并行进程中启动子 shell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18665603/