Linux echo在并行过程中启动子shell?
这是我的构造(只是一个示例): 在90%的情况下,它工作正常并输出(Linux echo在并行过程中启动子shell?,linux,bash,shell,Linux,Bash,Shell,这是我的构造(只是一个示例): 在90%的情况下,它工作正常并输出(foo位于file.txt): 但在10%的情况下,我看到(我不知道具体发生的时间和原因): 为什么会这样 注:实际上,我的代码如下所示: STDERR=$(mktemp /tmp/bash-XXXX); { something } 2> >( tail -100 | tee $STDERR ); CODE=$?; if [ $CODE != 0 ]; then echo -e "ERROR ${CODE}: \
foo
位于file.txt
):
但在10%的情况下,我看到(我不知道具体发生的时间和原因):
为什么会这样
注:实际上,我的代码如下所示:
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(“某物”),但fifo有缓冲区,因此它写入所有内容并继续。然后在某个不特定的时间,tail/tee被唤醒——有时太晚了:这意味着$STDERR在cat读取时仍然是空的
如何修复:完成后,您无法轻松地在t形台/尾部上进行同步。使用
{ something; } 2>&1 | tail ... | tee
你还需要别的方法来电汇吗?出于{某物}。我会回来的
- 一种方法是,设置 设置-o管道故障 这样,管道中的每个故障组件都会设置管道的退出状态
- 另一种方法是查询数组管道状态(请参见bash(1))
希望这有帮助您是否看到了该代码,或者
cat
是其他命令的替代品?这绝对不应该以书面形式发生。它完全是带有文件名的cat
,没有别的。我也很困惑…因为我在{0..10000};do echo-e“hello:[$(cat file.txt)]”;完成
对我来说,这很好。100%的案例都是在慢速访问介质中的文件?如果文件中有一些不可打印的光标定位字符,你能试试cat-v吗?我相信{something}2>>(tail-100 | tee$STDERR);等待
也会起作用。我确实运行了这个程序,在不同点设置睡眠是很有指导意义的。@Swiss:不。等待等待“作业”,而不是任何后台进程。是的:我只是尝试了一下:不起作用。wait
如果没有参数,应该等待所有子进程。在使用$STDERR之前,它应该充当一个屏障,允许所有内容同步。不知道为什么在这种情况下会失败。我会尽力深入研究的。sync;等待
紧接着code=$?
解决了这个问题,非常感谢!
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
{ something; } 2>&1 | tail ... | tee