sh - 如何在管道开始时检测错误?
问题描述
在我的脚本中,我需要处理管道的非最后一个命令的退出状态:
do_real_work 2>&1 | tee real_work.log
令我惊讶$?
的是,包含tee
. 确实,以下命令:
false 2>&1 | tee /dev/null ; echo $?
输出 0. 惊喜,因为 csh 的(几乎)等价的
false |& tee /dev/null ; echo $status
打印 1。
如何获取最新管道的非最后命令的退出代码?
解决方案
Bashset -o pipefail
使用第一个非零退出代码(如果有)作为管道的退出代码。
POSIX shell 没有这样的功能 AFAIK。你可以用不同的方法解决这个问题:
tail -F -n0 real_work.log &
do_real_work > real_work.log 2>&1
kill $!
也就是说,在运行命令之前开始跟踪尚未存在的文件,并在运行命令后终止进程。
推荐阅读
- amazon-web-services - 带有 docker 多容器和 Node 的 EB
- r - 多个度量和多个维度
- hibernate - 如何通过在 Spring Boot 中仅更改 hibernate 配置中的 db url 在运行时更改数据库连接?
- swift - 无法将 A 类型的值转换为 A 类型
- java - 更新 JSONObject 时并发修改异常
- sas - 有没有办法在 PCFILES 服务器中使用 SAS EG 复制文件?
- regex - 包含“!”的弹性搜索查询 在正则表达式查询中不匹配任何结果
- python - 我应该如何登录我的 pytest 插件?
- javascript - 当`fill`是“转发”时如何在动画后执行程序化`transform`
- ios - Swift:从另一个 viewController 类访问枚举