4

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

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

在 90% 的情况下,它可以正常工作并输出 ( foois in 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}
4

1 回答 1

1

你在这里有一个比赛条件。

tail -100 | tee $STDERR

已创建,但很可能在 fifo 上休眠(因为那时它仍然是空的)。您将写入程序写入fifo('某物'),但fifo有缓冲区,因此它会写入所有内容并继续。然后在某个不特定的时间,tail/tee 被唤醒 - 有时为时已晚:这意味着当 cat 读取 $STDERR 时它仍然是空的。

如何解决它:您无法轻松地在 tee/tail 完成后进行同步。利用

{ something; } 2>&1 | tail ... | tee

您需要其他方式来电报 $?出于{某事}。我会回来的。

  • 一种方法是,设置

    设置-o pipefail

    这样管道中的每个失败组件都会设置管道的退出状态。

  • 另一种方法是查询数组PIPESTATUS(参见 bash(1))。

希望这可以帮助

于 2013-09-06T20:55:03.783 回答