echo在并行进程中启动一个子shell?

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

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

在90%的情况下,它工作正常,输出( foofile.txt ):

 hello: [foo] 

但在10%的情况下,我看到(我不知道什么时候以及为什么发生):

 hello: [] foo 

为什么会发生?

PS。 实际上,我的代码如下所示:

 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有缓冲区,所以它写入所有并继续。 然后在某个非特定的时间尾巴/ T恤被唤醒 – 有时为时已晚:这意味着当猫读取它时,$ STDERR仍然是空的。

如何解决这个问题:你不能很容易地完成T /尾的同步。 使用

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

你需要其他的方式来telegraf $? 出于{something}。 我会回来的。

  • 一种方法是设置

    设置-o pipefail

    以便管道中的每个失败组件设置管道的退出状态。

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

希望这可以帮助