如何解决bash set -eerrexit仅适用于管道中的最后一个命令?
我一直在阅读有关bash set -e
选项的信息,但对于文件test-output.xml
不存在时为什么下面的管道为什么继续执行仍然有些困惑。
设置set -e
仅适用于最后一条命令的退出状态吗?我在该选项(例如tldp.org -> bash options)的文档中找不到(明确地)该语句。
谢谢您的帮助!
#!/usr/local/bin/bash
set -e
fail_tests=`cat test-output.xml|grep '^<testng-results '|perl -e 'print "0";'`
echo $?
echo "fail_tests: [$fail_tests]"
输出:
cat: test-output.xml: No such file or directory
0
fail_tests: [0]
但是,如果我将命令更改为:
#!/usr/local/bin/bash
set -e
fail_tests=`cat test-output.xml|grep '^<testng-results '|perl -e 'print "0"; exit 1;'`
echo $?
echo "fail_tests: [$fail_tests]"
它输出:
cat: test-output.xml: No such file or directory
运行bash版本:
➜ ~ /usr/local/bin/bash -version
GNU bash,version 5.0.18(1)-release (x86_64-apple-darwin19.5.0)
Copyright (C) 2019 Free Software Foundation,Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY,to the extent permitted by law.
解决方法
实际上,管道的退出代码是管道中最后一条命令的退出代码。因此,默认情况下,set -e
仅适用于每个管道中的最后一条命令。
Bash具有set -o pipefail
来扩展行为或将set -e
扩展到管道中的任何命令。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。