这是我的构造(只是一个例子):
echo -e "hello: [$(cat file.txt)]"
在90%的情况下,它工作正常,输出( foo
在file.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))。
希望这可以帮助