如何同时获取Linux命令的退出代码和标准输出

3

我在Linux shell脚本中执行curl [url]命令。我希望同时获取该命令的退出码和输出,而不使用临时文件。

有没有方法可以实现这个目的?


我留了一个答案,满足你的输出和退出代码的标准,而且没有临时文件。如果你有更具体的想法,请编辑你的问题并提供更多细节。 - user559633
3个回答

7
我猜测问题在于您有一个中介命令代替了最后一个命令的退出代码。为了解决这个问题,只需将退出代码和标准输出存储到变量中即可:
OUTPUT=$(curl example.org)
EXIT_CODE=$?

那么您可以直接将它们输出在同一行中:
echo "$EXIT_CODE: $OUTPUT"

或者根据需要分别调用它们。

1
这是错误的。退出状态将来自于赋值,而不是curl命令。 - Wyrmwood

4

(我没有足够的声望在用户559633的答案下评论。)

显然,如果将STDOUT发送到本地变量,则无法正常工作:

test.sh:

#!/bin/bash

function test1 () {
    OUTPUT=$( ping -c 1 -W 1 blah.org )
    EXIT_CODE=$?
    echo "$EXIT_CODE: $OUTPUT"
}

function test2 () {
    local OUTPUT=$( ping -c 1 -W 1 blah.org )
    EXIT_CODE=$?
    echo "$EXIT_CODE: $OUTPUT"
}

test1
test2

输出:

# ./test.sh
1: PING blah.org (205.150.150.140) 56(84) bytes of data.

--- blah.org ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
0: PING blah.org (205.150.150.140) 56(84) bytes of data.

--- blah.org ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

注意,test1的退出代码为1,但对于test2来说,它是0。
编辑:似乎将本地声明与赋值分开可以解决这个问题:
#!/bin/bash

function test1 () {
    OUTPUT=$( ping -c 1 -W 1 blah.org )
    EXIT_CODE=$?
    echo "$EXIT_CODE: $OUTPUT"
}

function test2 () {
    local OUTPUT
    OUTPUT=$( ping -c 1 -W 1 blah.org )
    EXIT_CODE=$?
    echo "$EXIT_CODE: $OUTPUT"
}

test1
test2

输出:

1: PING blah.org (205.150.150.140) 56(84) bytes of data.

--- blah.org ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
1: PING blah.org (205.150.150.140) 56(84) bytes of data.

--- blah.org ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

0

在管道中获取命令的退出状态没有标准方法。

然而,如果您使用(或能够使用)Bash作为您的shell,则PIPESTATUS内置数组变量保存最近执行的管道的结果。(请注意,这里一个单独的命令也算作管道)。

例如:

true | false | false | false; echo "${PIPESTATUS[0]}" "${PIPESTATUS[1]}"

输出:

0 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接