繁体   English   中英

如果早期部分失败,我可以阻止管道的后续部分运行吗?

[英]Can I stop later parts of a pipeline from running if an earlier part failed?

我有一个管道命令,如:

set -euxo pipefail

echo 'hello' | foo | touch example.sh

这是输出:

$ set -euxo pipefail
$ echo hello
$ foo
$ touch example.sh
pipefail.sh: line 4: foo: command not found

我认为set -e会导致脚本退出。 但即使foo无法识别,脚本仍在执行touch命令。 如果foo失败,如何让它退出?

你不能真正想到拥有“早期”或“更晚”部分的管道,除非数据从一端移动到另一端: 管道的所有部分同时运行。

因此,如果之前的部件失败,则无法阻止后续部件启动, 因为后部部件在前一部件的同时启动


上面说过,有一些机制允许管道在发生故障时提前关闭 - 这些机制以相同的方式工作,而不需要设置任何非默认的shell标志:

  • 如果您正在使用设计用于管道右侧的工具(与touch不同),它将从标准输入读取 - 因此,如果左侧的组件发生故障,将会看到早期的EOF。
  • 如果您正在使用设计用于管道左侧的工具,则当它尝试写入时,如果其右侧的东西不再运行,它将收到SIGPIPE

当然,如果你从一个没有写入stdout的程序或者一个不能从stdin读取的程序进行管道传输,这些机制就无法工作 - 但是这些程序在使用时没有多大意义。管道无论如何。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM