【问题标题】:What is the policy of terminating piped program in bash?在 bash 中终止管道程序的策略是什么?
【发布时间】:2013-07-28 11:07:41
【问题描述】:

管道程序何时终止,谁控制这个终止过程?我读过Bash: why the pipe is terminated?,但它只部分涵盖了这个问题。在尝试自己回答这个问题后,我做了几个例子来看看他们的输出。还有这个我看不懂:(a.sh):

#!/bin/bash

echoerr() { echo $@ 1>&2; }

echoerr a.sh started

sleep 1
echo 1

sleep 1
echo 2

sleep 1
echo 3

sleep 1 # Line 1
echo 4  # Line 2

echoerr a.sh finished

我以./a.sh | head -3 运行它。输出是:

a.sh started
1
2
3

从输出中我了解到./a.sh 在读取前 3 行输入后以SIGPIPE 信号终止,因为不需要更多数据。但是,当我删除 either 第 1 行 either 第 2 行时,输出更改为以下内容:

a.sh started
1
2
3
a.sh finished

所以我的问题是:

  • 终止管道程序的政策是什么?
  • 为什么第 1 行会影响程序行为?
  • 为什么第 2 行会影响程序行为?

【问题讨论】:

    标签: bash pipe termination sigpipe


    【解决方案1】:

    正如你所说,如果你的 shell 脚本试图写入一个封闭的管道,它就会死掉。如果没有就不会。

    如果删除第二行,a.sh 不会在echo 3 之后尝试写入其stdout,因此它没有失败的理由。

    每次运行测试时,删除第一行可能不会得到相同的结果。有时间问题。如果最后两个echo 语句在head 尝试从它的输入中读取(并由于达到3 行而终止)之前被处理,那么a.sh 不会出现管道损坏错误。如果时间是这样的,head 在两个echos 之间进行读取,那么a.sh 将得到管道错误,并死掉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      相关资源
      最近更新 更多