rom*_*fox 6 bash shell scripting exit-code
在 shell 脚本中,我使用带有大括号的代码块将所有输出通过管道传输到控制台和带有 tee 的日志文件。
#!/bin/bash
{
echo "Foo bar"
echo "foo bar on STDERR" >&2
ERRL=66
exit 99
} 2>&1 | tee log-file.log
Run Code Online (Sandbox Code Playgroud)
(这只是一个小演示脚本,原来的要复杂得多)
问题是,该行exit 99没有效果,脚本以退出代码 0 结束。(我认为这是 tee 命令的退出代码)
exit $ERRL我尝试在脚本末尾添加该行,但它显示变量 $ERRL 在大括号之外为空。
当代码块内出现问题时,我能做什么以错误代码结束脚本——而不丢失日志文件的输出?
重定向整个脚本的输出的侵入性最小的方法是预先执行一次,而不涉及任何阻塞结构:
exec > >(tee log-file.log) 2>&1 # redirect stdout and stderr to a pipe to tee
echo "Foo bar"
echo "foo bar on STDERR" >&2
ERRL=66
exit 99
Run Code Online (Sandbox Code Playgroud)
替代选项包括使用pipefail设置...
set -o pipefail
{ ... } 2>&1 | tee log-file.log
Run Code Online (Sandbox Code Playgroud)
...或者事后显式地拉出退出状态:
{ ... } 2>&1 | tee log-file.log
exit "${PIPESTATUS[0]}"
Run Code Online (Sandbox Code Playgroud)
...或者只是使用不是管道的重定向:
{ ... } > >(tee log-file.log) 2>&1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1960 次 |
| 最近记录: |