Bash 如何将输出重定向到文件和标准输出,并在出现错误时退出

Bash 如何将输出重定向到文件和标准输出,并在出现错误时退出,bash,shell,pipe,stdout,Bash,Shell,Pipe,Stdout,我可以在出现这样的错误时退出程序 ls /fake/folder || exit 1 我可以将输出重定向到一个文件,而不是像这样 ls /usr/bin | tee foo.txt 但我做不到 ls /fake/folder | tee foo.txt || exit 1 因为我得到的是tee的输出,而不是ls 如何将输出重定向到文件和标准输出以及出错退出这正是pipefail运行时选项的作用: # Make a pipeline successful only if **all** co

我可以在出现这样的错误时退出程序

ls /fake/folder || exit 1
我可以将输出重定向到一个文件,而不是像这样

ls /usr/bin | tee foo.txt
但我做不到

ls /fake/folder | tee foo.txt || exit 1
因为我得到的是
tee
的输出,而不是
ls


如何将输出重定向到文件和标准输出以及出错退出这正是
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扩展,那么将其放在流程替代而不是管道中将防止
tee
影响退出状态:

ls /fake/folder > >(tee foo.txt) || exit 1