pipefail 选项,不起眼,却很重要

set -o pipefail 是一个在 Bash shell 脚本中常用的命令,它的作用是改变管道命令的退出状态。

在默认情况下,一个管道命令(由多个命令通过管道符 | 连接而成的命令)的退出状态是最后一个命令的退出状态,而不考虑前面的命令是否执行成功。

例如,下面的命令:

复制代码
command1 | command2

如果 command1 失败(返回非零退出状态),但 command2 成功(返回零退出状态),那么整个管道命令的退出状态是 0(成功)。

但是如果你使用了set -o pipefail,那么如果 command1 失败,整个管道命令的退出状态就是 command1 的退出状态,即使 command2 成功。

这个选项通常用于错误处理,确保管道中的每个命令都成功执行。如果管道中的任何一个命令失败,整个管道命令就会被认为是失败的,这样就可以在脚本中捕获到错误并进行相应的处理。

下面举个例子。

假设我们有两个命令,command1 和 command2。command1 总是失败,command2 总是成功。我们可以用一个简单的脚本来模拟这种情况:

shell 复制代码
#!/bin/bash

# 定义一个总是失败的命令
command1() {
  echo "Running command1"
  return 1
}

# 定义一个总是成功的命令
command2() {
  echo "Running command2"
  return 0
}

# 不使用 set -o pipefail
echo "Without set -o pipefail"
command1 | command2
echo "Exit status: $?"

# 使用 set -o pipefail
echo "With set -o pipefail"
set -o pipefail
command1 | command2
echo "Exit status: $?"

output

复制代码
Without set -o pipefail
Running command2
Exit status: 0
With set -o pipefail
Running command2
Exit status: 1

在这个脚本中,command1 和 command2 都是函数,分别返回 1(失败)和 0(成功)。

当我们不使用set -o pipefail时,尽管 command1 失败,但整个管道命令的退出状态仍然是 0,因为 command2 成功。

当我们使用set -o pipefail时,尽管 command2 成功,但整个管道命令的退出状态是 1,因为 command1 失败。

小结

这是一个很小的基础知识,当我们掌握并正确使用后,却可以发挥巨大作用。

就像一块砖,我们可以用来盖鸡窝,可以用来砌猪圈,也可以用来建楼房。

苦练基本功,共勉之。

相关推荐
MicrosoftCloud4 小时前
性能排查 01|free 显示内存用了 90% 就是快满了吗?buff/cache 与 available 一次讲清
linux·运维·内存·free·buff/cache
灯澜忆梦4 小时前
【docker】#1 | Docker 初识
运维·docker·容器
风寄巴山秋4 小时前
OpenBMC:Web 页面功能异常排查
运维·服务器·前端·架构
小白的码BUG之路5 小时前
Jenkins -- 连接gitee
运维·gitee·jenkins
峥无5 小时前
Linux线程深度剖析:轻量级进程、虚拟内存分页、进程线程资源对比
linux·运维·mmap
骑着蜗牛撵大象3275 小时前
穿越 Docker 内核迷雾:镜像分层的叠加态与卷挂载的空间穿梭
运维·docker·容器·联合文件系统·卷挂载·镜像分层·存储驱动
honsor5 小时前
以太网温湿度传感器:RJ45直连机房的环境监控新方案
运维·网络·数据库·物联网·安全·云计算·github
zxcvb1536 小时前
规定备份信息的备份方式:从策略制定到自动化落地的实践思考
运维·oracle·自动化
ZeroNews内网穿透6 小时前
内网穿透安全加固实践:通过 Geo 地理围栏阻挡境外扫描风险
运维·安全·devops
柏慧通云报餐6 小时前
智慧食堂食材溯源数字化方案|采购 - 入库 - 餐桌全链路记录体系落地实践
大数据·运维·人工智能