Shell 外壳程序退出代码与简单命令不一致

Shell 外壳程序退出代码与简单命令不一致,shell,unix,redirect,exit-code,Shell,Unix,Redirect,Exit Code,我有一个不太难解决的问题,我就是不知道我做错了什么 我需要测试一个命令是否成功,并且需要从脚本执行该命令。命令是: curl 127.0.0.1:5000 &> /dev/null 现在没有服务器在运行,所以它应该总是失败的。当我从命令行执行它时,它确实失败了。但是,当我在shell脚本中运行它时,它失败了,但退出代码是0。那是什么原因呢 以下是脚本: if curl 127.0.0.1:5000 &> /dev/null then echo "s

我有一个不太难解决的问题,我就是不知道我做错了什么

我需要测试一个命令是否成功,并且需要从脚本执行该命令。命令是:

curl 127.0.0.1:5000 &> /dev/null
现在没有服务器在运行,所以它应该总是失败的。当我从命令行执行它时,它确实失败了。但是,当我在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):

有人有主意吗

编辑: 我用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的系统中,它将按原样工作。

有趣的是,您可以共享用于此的shell吗?我在zshOh中使用命令
sh[script\u name].sh
,现在我尝试使用命令
zsh[script\u name].sh
,它按预期工作!所以我猜这是因为如果你用另一个shell的命令调用你的脚本,它可能会弄乱退出代码?这很奇怪,因为如果我不使用重定向,它可以与
sh
一起工作。不管怎样,现在它工作了,谢谢!你在哪里学会用
sh[script\u name].sh调用脚本的?这导致了许多问题。只要有一个合适的“she bang”行(
#!/bin/zsh
,在您的情况下)并使用
/path/to/script\u name.sh[args]
调用,或者将脚本存储在
$path
中包含的目录中。祝你好运。谢谢你的解释!现在我记得我已经在某个地方看到,
&
是bash4的一个特性。
if curl 127.0.0.1:5000
then
    echo "sucess"
    exit 0
else
    echo "failure"
    exit 1
fi