2026/6/28 15:07:54
网站建设
项目流程
兰州城关区建设局网站,施工企业样板先行制度,微信企业号网站开发软件,公司logo形象墙文章目录管道退出码的基本机制解决方案方案1#xff1a;set -o pipefail[推荐]方案2 - 进程替换管道退出码的基本机制
当我们执行一个管道命令时#xff1a;
command1 | command2 | command3Shell 会#xff1a;
创建匿名管道#xff08;pipe#xff09;连接各个命令并…文章目录管道退出码的基本机制解决方案方案1set -o pipefail[推荐]方案2 - 进程替换管道退出码的基本机制当我们执行一个管道命令时command1|command2|command3Shell 会创建匿名管道pipe连接各个命令并行启动所有命令等待所有命令完成返回最后一个命令的退出码真实世界的危险场景# 危险的日志处理critical_data_export|teeexport.logif[$?-eq0];thenecho数据导出成功发送通知...send_success_notificationelseecho数据导出失败fi如果 critical_data_export 失败但 tee 成功脚本会错误地发送成功通知。# 危险的数据处理extract_data_from_api|transform_data|load_to_databaseif[$?-eq0];thenmark_job_as_completedfi如果数据提取失败但后续步骤成功处理了空数据任务会被错误标记为完成。解决方案方案1set -o pipefailBash 提供了 pipefail 选项使管道在任何命令失败时返回非零退出码set-opipefail command1|command2|command3echo管道退出码:$?# 如果任何命令失败这里就是非零不是所有 Shell 都支持 pipefailDash: 不支持某些嵌入式系统的 Shell: 可能不支持[推荐]方案2 - 进程替换进程替换Process Substitution是 Bash 和 Zsh 等现代 Shell 提供的高级特性# 基本语法command(other_command)# 输出重定向到进程command(other_command)# 从进程读取输入进程替换解决退出码问题# 使用进程替换command(teelogfile.log)21exit_code$?echo真实的命令退出码:$exit_code工作机制详解创建匿名管道Shell 创建一个 FIFO 或匿名管道启动目标进程tee 进程连接到管道的读端重定向输出主命令的输出重定向到管道的写端并行执行两个进程并行运行退出码保留$? 获取的是主命令的退出码与传统管道的对比# 传统管道command|teelogfile.logecho$?# tee 的退出码# 进程替换command(teelogfile.log)21echo$?# command 的退出码