Linux Bash-a vs Bash&&;

Linux Bash-a vs Bash&&;,linux,bash,conditional,debian-based,Linux,Bash,Conditional,Debian Based,我有一个bash声明: if ls > /dev/null 2>&1 -a ls > /dev/null 2>&1; then echo "true"; else echo "false"; fi 这给了我“假”。但我知道ls将始终返回0(即true)。我原以为-a是一个AND语句 当我将此更改为: if ls > /dev/null 2>&1 && ls > /dev/null 2>

我有一个bash声明:

if ls > /dev/null 2>&1 -a ls > /dev/null 2>&1; then
    echo "true"; 
else 
    echo "false"; 
fi
这给了我“假”。但我知道
ls
将始终返回
0
(即true)。我原以为
-a
是一个AND语句

当我将此更改为:

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

它起作用了。这里发生了什么不同?
-a
不是AND运算符吗?

&&
是在bash中执行短路逻辑AND的正确方法。

-a
是一个
test
操作数(
test
也是一个名为
[
)的命令)。它不表示和在任何其他上下文中(例如,内置于bash中;它也是
find
中的谓词)。此外,它还标记为“过时”;在链接页面中搜索
OB


上面还说,
[-n“$foo”]&&[-n“$bar”]
,或
[[$foo&$bar]
,比
[-n“$foo”-a-n“$bar”]
&
是在bash中执行逻辑和短路的正确方法。

-a
是一个
test
操作数(
test
也是一个名为
[
)的命令)。它不表示和在任何其他上下文中(例如,内置于bash中;它也是
find
中的谓词)。此外,它还标记为“过时”;在链接页面中搜索
OB


上面还说,
[-n“$foo”]&&&[-n“$bar”]
,或
[[$foo&$bar]
,比
[-n“$foo”-a-n“$bar”]
更好的实践,顺便说一句,使用
grep-q“state UP”更有效
,而不必为
/dev/null
费心。当
grep
知道您不需要输出时,它(1)不必费心写它,甚至不必写到它被扔掉的
/dev/null
;和(2)只要看到匹配项,就可以立即退出,无需读取输入流的其余部分。@CharlesDuffy感谢您在
grep-q“state UP”
中的注释,我以后会使用它。对于以后发现此问题的任何人,此问题通常有以下命令:
ip link show eth1 | grep“state UP”>/dev/null 2>&1
为了简单起见,我编辑了它。顺便说一句,使用
grep-q“state UP”
更有效,而且不必费心处理
/dev/null
。当
grep
知道你不需要输出时,它(1)就不用费心去写它,甚至到
/dev/null
被扔掉的地方;和(2)只要看到匹配项,就可以立即退出,无需读取输入流的其余部分。@CharlesDuffy感谢您在
grep-q“state UP”
中的注释,我以后会使用它。对于以后发现此问题的任何人,此问题通常有以下命令:
ip link show eth1 | grep“state UP”>/dev/null 2>&1
为了简单起见,我编辑了它。shell语法通常非常依赖于上下文。也就是说,各种符号的含义在很大程度上取决于它出现的位置。
&&
在命令之间(如
[-n“$foo”]&&[-n“$bar”]
)或
[[]]内部表示“逻辑和”
(())
,但不在
[]
内部-a
仅当它出现在
[]
内部时表示“逻辑and”(然后仅在某些位置)这只是这个上下文依赖的许多例子之一。我不太愿意调用<代码> -< /COD> shell语法——它是 Test> 规范的一部分,而不是部分,而 & & 是该语言的一部分。我不同意,但我认为这是我所讨论的上下文依赖的区别部分。他那种让我讨厌bash的东西:“或者在
[[]]
或者
(())
,但不是在
[]
里面。”.有没有一种平易近人的方法来学习这些东西,让它看起来更有动力和说服力,而不是像我现在看到的那样让人讨厌、考虑不周、管道堵塞、难以接近的混乱局面?@Connor,…所以,你把这归因于一个做出了非常可怕的设计决策的人,而不是一个试图修复别人的人e几十年前的设计疏忽以避免向后不兼容。Bash充满了这种情况,是的,但考虑到上下文和历史,其基本原理变得不那么神秘。一般来说,shell语法非常依赖上下文。也就是说,各种符号的含义在很大程度上取决于它出现的位置。
&&
意味着“逻辑and”在命令之间(如
[-n“$foo”]&&-[-n“$bar”]
),或在
[[]]
内部或
(())
,但不在
[]
内部时,-a仅在
[]
内部表示“逻辑and”(然后仅在某些位置)这只是这个上下文依赖的许多例子之一。我不太愿意调用<代码> -< /COD> shell语法——它是 Test> 规范的一部分,而不是部分,而 & & 是该语言的一部分。我不同意,但我认为这是我所讨论的上下文依赖的区别部分。他那种让我讨厌bash的东西:“或者在
[[]]
或者
(())
,但不是在
[]
".有没有一种平易近人的方法来学习这些东西,让它看起来更有动力和说服力,而不是像我现在看到的那样让人讨厌、考虑不周、管道堵塞、难以接近的混乱局面?@Connor,…所以,你把这归因于一个做出了非常可怕的设计决策的人,而不是一个试图修复别人的人是的,Bash充满了这一点,但考虑到上下文和历史,其基本原理就变得不那么神秘了。