这是我的构造(只是一个例子):

echo -e "hello: [$(cat file.txt)]"

在 90% 的情况下,它可以正常工作并输出( foofile.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 管道故障

    这样管道中的每个失败组件都会设置管道的退出状态。
  • 另一种方法是查询数组 PIPESTATUS(请参阅 bash(1))。

  • 希望这可以帮助

    关于linux - echo 在并行进程中启动子shell?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18665603/

    10-13 05:36