如何同时获取linux命令的退出代码和stdout

时间:2015-08-27 13:43:42

标签: linux shell output stdout exit-code

我在Linux shell脚本中执行curl [url]命令。我想在不使用临时文件的情况下同时获取此命令的退出代码及其输出。

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:7)

我假设问题是你有一个中间命令取代了最后一个命令的退出代码。

要解决此问题,只需将退出代码和stdout存储在变量中:

OUTPUT=$(curl example.org)
EXIT_CODE=$?

然后你可以在同一行输出这些:

echo "$EXIT_CODE: $OUTPUT"

或根据需要单独打电话。

答案 1 :(得分:2)

(我没有足够的声望点来评论user559633的答案。)

如果将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的exitcode为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

答案 2 :(得分:0)

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

但是,如果您使用(或能够使用)Bash作为shell,PIPESTATUS内置数组变量将保存最近执行的管道的结果。 (请注意,单个命令在此处计为管道。)

示例:

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

输出:

0 1