set -eu
VAR=$(zcat file.gz | head -n 12)
Run Code Online (Sandbox Code Playgroud)
工作良好
set -eu -o pipefail
VAR=$(zcat file.gz | head -n 12)
Run Code Online (Sandbox Code Playgroud)
导致bash退出失败.这怎么会导致管道故障?
请注意,file.gz包含数百万行(约750 MB,已压缩).
Cha*_*ffy 19
想一想,片刻.
zcat输出它的输出head.head在读取12行之后退出,超过12行的输入流.的当然你有一个错误:zcat有目的地管道早关闭,是不是能够成功地编写输入文件的解压缩版本!它没有任何方式知道这是由于用户意图,通过错误发生的事情.
如果您正在使用zcat写入磁盘并且空间不足或网络流耗尽而且连接丢失,那么退出并指示失败的状态将是完全正确的.这只是该规则的另一种情况.
由syscall在以下条件下返回zcat操作系统给出的特定错误:尝试写入未打开以供任何进程读取的管道.EPIPEwrite
在head(此FIFO的唯一读取器)退出之后,对于管道输入端的任何写入都不会返回EPIPE将是一个错误.为了zcat静默地忽略写入其输出的错误,从而能够生成不准确的输出流而没有反映此事件的退出状态,同样也是一个错误.
如果您不想更改任何shell选项,顺便提一下,您可能会考虑使用进程替换的一种解决方法:
var=$(head -n 12 < <(zcat file.gz))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,zcat不是管道组件,并且不考虑其退出状态以确定成功.($var如果您想要进行独立的成功/失败判断,您可以测试是否长12行.
| 归档时间: |
|
| 查看次数: |
1054 次 |
| 最近记录: |