&安培;&安培; vs& amp;使用bash中的test命令

时间:2014-11-06 02:04:07

标签: linux bash

gndlp@ubuntu:~$ test -x examples.desktop  && echo $?
gndlp@ubuntu:~$ test -x examples.desktop  & echo $?
[1] 2992
0

为什么bash在这种情况下表现得像?测试命令是否未完成,因此未处理echo命令?

3 个答案:

答案 0 :(得分:32)

&&&的含义本质上是不同的。

  • &&中的bash是什么? bash - 以及许多其他编程语言 - &&表示“AND”。在这样的命令执行上下文中,它意味着在这种情况下,&&左侧和右侧的项应该按顺序运行。
  • &中的bash是什么?单个&表示前面的命令 - 位于&的左侧 - 应该只是在后台运行。

看看你的例子:

gndlp@ubuntu:~$ test -x examples.desktop  && echo $?
gndlp@ubuntu:~$ test -x examples.desktop  & echo $?
[1] 2992
0

第一个命令 - 因为它是结构化的 - 实际上不会返回任何内容。但是第二个命令返回[1] 2992,其中2992指的是在后台运行的进程ID(PID),0是第一个命令的输出。

由于第二个命令只是在后台运行test -x examples.desktop,所以它很快就会发生,因此进程ID会立即生成并立即显示。

答案 1 :(得分:6)

&在后​​台执行命令,无论其状态如何都将返回0。

来自the man page

  

如果命令由控制操作符&终止,则shell在子shell中在后台执行命令。 shell不等待命令完成,返回状态为0.命令由a分隔;按顺序执行; shell等待每个命令依次终止。返回状态是最后执行的命令的退出状态。

答案 2 :(得分:3)

看看你的命令是什么:

test -x examples.desktop  && echo $?

这意味着检查examples.desktop是否可执行,然后执行echo $?

test -x examples.desktop  & echo $?

表示检查examples.desktop是否可执行并在"背景中运行"然后执行echo $?