这是我的构造(只是一个例子):
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 上 sleep (因为那时它仍然是空的)。您的程序写入 fifo ('something') 但 fifo 有缓冲区,所以它会写入所有内容并继续。然后在某个不特定的时间,尾部/发球台被唤醒 - 有时太晚了:这意味着当 cat 读取它时 $STDERR 仍然是空的。
如何修复:您无法在完成后轻松同步发球台/尾部。用
{ something; } 2>&1 | tail ... | tee
你需要一些其他的方式来电报 $?出于{某事}。我会回来的。
set -o 管道故障
这样管道中的每个失败组件都会设置管道的退出状态。
希望这可以帮助
关于linux - echo 在并行进程中启动子shell?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18665603/