【发布时间】:2015-11-21 22:27:24
【问题描述】:
我在 Linux shell 脚本中执行curl [url] 命令。我想在不使用临时文件的情况下同时获取此命令的退出代码及其输出。
有什么方法可以做到吗?
【问题讨论】:
-
我留下的答案满足您的输出和退出代码标准,但没有临时文件。如果您有更具体的想法,请编辑您的问题并提供更多详细信息。
标签: linux shell output stdout exit-code
我在 Linux shell 脚本中执行curl [url] 命令。我想在不使用临时文件的情况下同时获取此命令的退出代码及其输出。
有什么方法可以做到吗?
【问题讨论】:
标签: linux shell output stdout exit-code
我假设问题在于您有一个中间命令取代了最后一个命令的退出代码。
要解决这个问题,只需将退出代码和标准输出存储在变量中:
OUTPUT=$(curl example.org)
EXIT_CODE=$?
那么您可以在同一行中简单地输出这些:
echo "$EXIT_CODE: $OUTPUT"
或根据需要单独调用。
【讨论】:
(我没有足够的声望点来评论 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 的退出代码是 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
【讨论】:
没有标准的方法来获取管道中命令的退出状态。
但是,如果您正在使用(或能够使用)Bash 作为您的 shell,则 PIPESTATUS 内置数组变量会保存最近执行的管道的结果。 (请注意,单个命令在这里算作管道)。
例子:
true | false | false | false; echo "${PIPESTATUS[0]}" "${PIPESTATUS[1]}"
输出:
0 1
【讨论】: