【发布时间】:2024-04-16 05:15:01
【问题描述】:
我在调试一个shell脚本,问题是下面的代码
if curl doesntexist -i &> /dev/null;
then
echo True
else
echo False
fi
如果运行 zsh,则不等于:
if curl 6 -i 1> /dev/null 2> /dev/null;
then
echo True
else
echo False
fi
后面的回显如预期的那样为真,但如果我用 &> 重定向,则输出为假。 我不明白这种行为,例如here 它说
&>name is like 1>name 2>name
谁能解释一下为什么两个 sn-ps 在 zsh 中运行时的行为不一样?从 zsh docu 它说它还应该重定向 stdout 和 stderr,听起来它应该和 bash 中的一样:
&> 以'> word'的方式重定向标准输出和标准错误(文件描述符2)
【问题讨论】:
-
无法重现,按预期工作 - 两者都给出 False
-
你确定你在
bash运行吗?&>在其他 shell 中不能以同样的方式工作。 -
是的,刚刚注意到。这是因为我在运行 zsh
-
test.sh是否有 shebang(#!/bin/zsh或类似名称)?如果没有,./test.sh在从bash运行时将使用bash执行,但从zsh运行时使用/bin/sh。 -
&>不是/bin/sh中公认的重定向运算符;它可能被解析为两个单独的命令:curl在后台运行,&(其退出状态始终为 0;curl本身的退出状态不相关)和一个空命令 @987654339 @ 也始终具有退出状态 0:因此采用True路径。