gpt4 book ai didi

bash - 获取管道后台进程的退出代码

转载 作者:行者123 更新时间:2023-12-03 09:16:27 25 4
gpt4 key购买 nike

someCommand 2>&1 | grep pattern &

如何获取 someCommand 的退出状态?

PIPESTATUS 不起作用,因为它是后台进程。

我找到了这个link它似乎有效,但前提是我完全按照这种方式使用它。简单的回显到屏幕似乎不起作用。我想知道是否可以在不创建临时文件的情况下获取退出代码。

最佳答案

在 bash 中你可以这样做:

echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"

示例:

$ ls -l | grep somefile
-rw-rw-r-- 1 me me 32 May 4 15:47 somefile
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
0 0

$ ls -l 1>/dev/null | grep while
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
0 1

对于管道前台进程

如果是 testscript.sh 脚本,其中包含:

#!/bin/bash
echo "Some Stuff"
exit 29 # Some random exit code for testing

$./testscript.sh | grep somestuff
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
29 1

对于管道后台进程

方法1:使用pipefail

对于包含以下内容的 testscript.sh:

#!/bin/bash
set -eo pipefail
#set -o pipefail causes a pipeline to produce a failure return code
#If a command fails, set -e will make the whole script exit,
cat nonexistingfile # this command fails
echo "Some Stuff"
exit 29

$ ./testscript.sh 2>/dev/null | grep Some &
[2] 7684
$ fg 2
bash: fg: job has terminated
[2]- Exit 1 ./testscript.sh 2> /dev/null | grep --color=auto Some

您会得到退出状态 1,从中可以得出脚本失败的结论。

如果cat nonexistingfile被删除,你会得到:

[2]-  Done                    ./37257668.sh 2> /dev/null | grep --color=auto Some

缺点:pipefail 将为所有不特定于失败命令的退出代码返回 1

方法 2:获取 shell 脚本

$ . ./testscript.sh 2>/dev/null | grep Some & #mind the dot in the beginning
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
29 0

最终接触

如果您怀疑 shell 脚本、测试脚本中的单个命令失败,您可以执行以下操作:

#no shebang
echo "Some Stuff"
ls non_existent 2>/dev/null || ls__return_value=50

$. ./testscript | grep "Some"

$if [ $ls__return_value -eq 50 ]; then echo "Error in ls"; fi

关于bash - 获取管道后台进程的退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37257668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com