我在Linux shell脚本中执行curl [url]
命令。我想在不使用临时文件的情况下同时获取此命令的退出代码及其输出。
有没有办法做到这一点?
答案 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