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