• 欢迎访问web前端中文站,JavaScript,CSS3,HTML5,web前端demo
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏web前端中文站吧

Shell bash 脚本 set -o pipefail 教程

JAVA web前端中文站 2年前 (2017-11-18) 1449次浏览 已收录 0个评论

前面已经学习了《Shell Bash 的错误处理》以及《Shell bash 脚本 set -e 教程》,在 set -e 中,

有一个例外情况,就是不适用于管道命令。

更多精彩内容请看 web 前端中文站
http://www.lisa33xiaoq.net 可按 Ctrl + D 进行收藏

所谓管道命令,就是多个子命令通过管道运算符(|)组合成为一个大的命令。Bash 会把最后一个子命令的返回值,作为整个命令的返回值。也就是说,只要最后一个子命令不失败,管道命令总是会执行成功,因此它后面命令依然会执行,set -e就失效了。

请看下面这个例子。

 #!/usr/bin/env bash set -e  foo | echo a echo bar

执行结果如下。

 $ bash script.sh a script.sh:行 4: foo: 未找到命令 bar

上面代码中,foo是一个不存在的命令,但是foo | echo a这个管道命令会执行成功,导致后面的echo bar会继续执行。

set -o pipefail用来解决这种情况,只要一个子命令失败,整个管道命令就失败,脚本就会终止执行。

 #!/usr/bin/env bash set -eo pipefail  foo | echo a echo bar

运行后,结果如下。

 $ bash script.sh a script.sh:行 4: foo: 未找到命令

可以看到,echo bar 没有执行。

set 命令的-u/-e/-x/?-o pipefail 这四个参数,一般都放在一起使用。

 # 写法一 set -euxo pipefail  # 写法二 set -eux set -o pipefail

这两种写法建议放在所有 Bash 脚本的头部。

另一种办法是在执行 Bash 脚本的时候,从命令行传入这些参数。

 $ bash -euxo pipefail script.sh

参考资料

  • The Set Builtin
  • Safer bash scripts with ‘set -euxo pipefail’
  • Writing Robust Bash Shell Scripts

【注:本文源自网络文章资源,由站长整理发布】


web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Shell bash 脚本 set -o pipefail 教程
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址