gndlp@ubuntu:~$ test -x examples.desktop && echo $?
gndlp@ubuntu:~$ test -x examples.desktop & echo $?
[1] 2992
0
为什么bash在这种情况下表现得像?测试命令是否未完成,因此未处理echo命令?
答案 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 $?