Shell 退出代码与简单命令不一致
Shell exit codes inconsistants with simple command
我有一个不应该太难解决的问题,我只是不知道我做错了什么。
我需要测试命令是否成功,并且需要从脚本中执行该命令。命令是:
curl 127.0.0.1:5000 &> /dev/null
现在没有服务器 运行ning,所以它应该总是失败。当我从命令行执行它时它确实失败了。但是,当我从 shell 脚本中 运行 它时,它失败了,但退出代码为 0。这可能是什么原因?
这是脚本:
if curl 127.0.0.1:5000 &> /dev/null
then
echo "sucess"
exit 0
else
echo "failure"
exit 1
fi
这是输出:
success
curl: (7) Failed to connect to 127.0.0.1 port 5000: Connection refused
但是,如果我删除重定向,它确实会按预期工作(我是 shell 代码的初学者,但是重定向不应该也重定向退出代码,对吗?所以我真的不不知道这是什么意思)
这里是没有重定向的代码,它按预期工作(因此表示失败并且退出代码为 1):
if curl 127.0.0.1:5000
then
echo "sucess"
exit 0
else
echo "failure"
exit 1
fi
有人有想法吗?
编辑:
我在 zsh 中使用 sh script_name.sh
启动脚本。当我使用 zsh script_name.sh
它现在可以正常工作。我仍然不完全明白为什么,但至少它有效!
"&> /dev/null" 在 Bourne shell (sh) 中有不同的解释,"&" 将命令置于后台,您可以使用 "sleep 100 &>/dev/null" 对其进行测试。由于成功将命令置于后台,因此成功,忽略后台命令的退出状态。
如果您想让它在 Bourne shell (sh) 中工作,请使用传统语法 ">/dev/null 2>&1",它也将在较新的 shell 中工作,即它更兼容。
在 sh 链接到 bash 的系统中,它将按原样工作。
我有一个不应该太难解决的问题,我只是不知道我做错了什么。
我需要测试命令是否成功,并且需要从脚本中执行该命令。命令是:
curl 127.0.0.1:5000 &> /dev/null
现在没有服务器 运行ning,所以它应该总是失败。当我从命令行执行它时它确实失败了。但是,当我从 shell 脚本中 运行 它时,它失败了,但退出代码为 0。这可能是什么原因?
这是脚本:
if curl 127.0.0.1:5000 &> /dev/null
then
echo "sucess"
exit 0
else
echo "failure"
exit 1
fi
这是输出:
success
curl: (7) Failed to connect to 127.0.0.1 port 5000: Connection refused
但是,如果我删除重定向,它确实会按预期工作(我是 shell 代码的初学者,但是重定向不应该也重定向退出代码,对吗?所以我真的不不知道这是什么意思)
这里是没有重定向的代码,它按预期工作(因此表示失败并且退出代码为 1):
if curl 127.0.0.1:5000
then
echo "sucess"
exit 0
else
echo "failure"
exit 1
fi
有人有想法吗?
编辑:
我在 zsh 中使用 sh script_name.sh
启动脚本。当我使用 zsh script_name.sh
它现在可以正常工作。我仍然不完全明白为什么,但至少它有效!
"&> /dev/null" 在 Bourne shell (sh) 中有不同的解释,"&" 将命令置于后台,您可以使用 "sleep 100 &>/dev/null" 对其进行测试。由于成功将命令置于后台,因此成功,忽略后台命令的退出状态。
如果您想让它在 Bourne shell (sh) 中工作,请使用传统语法 ">/dev/null 2>&1",它也将在较新的 shell 中工作,即它更兼容。
在 sh 链接到 bash 的系统中,它将按原样工作。