linux - echo 在并行进程中启动子 shell?

标签 linux bash shell

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

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

在 90% 的情况下它工作正常并输出(foofile.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}

最佳答案

这里出现了竞争条件。

tail -100 | tee $STDERR

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

如何解决:您无法在 tee/tail 完成时轻松同步。使用

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

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

  • 一种方法是,设置

    设置-o管道失败

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

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

希望对你有帮助

关于linux - echo 在并行进程中启动子 shell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18665603/

相关文章:

linux - 条件测试时 Shell 脚本权限被拒绝

c - 对 `printk' 的 undefined reference

python - 为什么我无法连接到 django 服务器?

linux - 如何获取与预推 git Hook 中的原始文件不同的所有文件的列表

shell - Linux Mint上的Hadoop HBase脚本产生奇怪的错误

shell - 使用自定义排序顺序对 Unix 中的字母数字字符串进行排序

c - 使用 malloc 和 realloc 动态地将字符串添加到 char 指针

ruby-on-rails - 如何将 Ruby on Rails 应用程序转换为 Windows/Linux 服务?

bash - 匹配以在 bash 中全局捕获组

bash - 为什么 `>` 重定向不捕获替代进程的标准输出?