Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux echo在并行过程中启动子shell?_Linux_Bash_Shell - Fatal编程技术网

Linux echo在并行过程中启动子shell?

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}: \

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

在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}: \"$(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