如何将输出重定向到文件和STDOUT并在出错时退出

时间:2018-02-23 00:46:20

标签: bash shell pipe stdout

我可以像错误一样退出程序

ls /fake/folder || exit 1

我可以将输出重定向到文件和STDOUT,如此

ls /usr/bin | tee foo.txt

但我无法做到

ls /fake/folder | tee foo.txt || exit 1

因为我获得了tee而不是ls

的输出

如何将输出重定向到文件和STDOUT 错误退出

1 个答案:

答案 0 :(得分:6)

完全 pipefail运行时选项的含义:

# Make a pipeline successful only if **all** components are successful
set -o pipefail
ls /fake/folder | tee foo.txt || exit 1

顺便提一下,如果你想明确优先顺序,请考虑:

set -o pipefail
{ ls /fake/folder | tee foo.txt; } || exit 1  # same thing, but maybe more clear

...或者,如果您想避免进行运行时配置更改,可以使用PIPESTATUS检查最新管道的任何单个元素的退出状态:

ls /fake/folder | tee foo.txt
(( ${PIPESTATUS[0]} == 0 )) || exit

如果您不想采取上述任何方法,但 愿意使用bash采用的ksh扩展,则将其置于进程替换而不是管道将阻止{ {1}}影响退出状态:

tee