在Shell中使用日志重定向时如何获取函数的retune代码?

How to get retune code of function when using log redirection in Shell?

在我的shell脚本1中,有效。:

test1.sh

python main.py
if [[ $? -ne 0 ]]
then
exit
fi

test2.sh

python main.py 2>&1 | tee log.txt 
if [[ $? -ne 0 ]]
then
exit
fi

脚本 2 失败。 python-call main in test2.sh 的 return 代码怎么获取?

如果您在一行中使用多个命令,则需要使用 PIPESTATUS 为每个命令获取正确的 return 代码。

例如:

Python代码:

import sys


def exit_with_code():
    sys.exit(5)


exit_with_code()

Shell 脚本:

python3 test.py  2>&1 | tee log.txt
echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"

输出:

5 0

表示Python脚本的return代码为5,tee脚本的return代码为0。

您可以在 if 之外进行重定向,同时避免反模式。

if ! python main.py; then
   exit
fi 2>&1 | tee log.txt

(见

您为 POSIX Shell 标记了您的问题,AFIK,在 POSIX Shell 中无法实现此目的。但是,许多其他 shell 确实具有允许这样做的功能。

例如,如果您可以使用 bash,则可以使用 PIPESTATUS,正如此处已经建议的那样。如果你选择 Zsh,有一个类似的数组,名为 pipestatus.

如果你想要 ksh,你没有等效的功能,但是 是关于如何在 Korn Shell 中处理这个问题的讨论。