Bash -a 与 bash &&

Bash -a vs bash &&

我有这个 bash 声明:

if ls > /dev/null 2>&1 -a ls > /dev/null 2>&1; then
    echo "true"; 
else 
    echo "false"; 
fi

这给了我 "false"。但我知道 ls 将始终 return 0(即正确)。我以为 -a 是一个 AND 语句。

当我将其更改为:

if ls > /dev/null 2>&1 && ls > /dev/null 2>&1; then
    echo "true"; 
else 
    echo "false"; 
fi

有效。这里有什么不同? -a 不是 AND 运算符吗?

&& 是在 bash.

中执行短路逻辑与的正确方法

-a 是一个 test 操作数(test 是命令也被命名为 [)。它并不表示任何其他上下文中的 AND(内置于 bash;它 也是 find 中的谓词)。此外,the POSIX specification for test已标记为"obsolescent";在链接页面中搜索 OB

上面也是说[ -n "$foo" ] && [ -n "$bar" ],或者[[ $foo && $bar ]][ -n "$foo" -a -n "$bar" ]更好的做法。