&& vs&使用bash中的test命令

gnd*_*dlp 23 linux bash

gndlp@ubuntu:~$ test -x examples.desktop  && echo $?
gndlp@ubuntu:~$ test -x examples.desktop  & echo $?
[1] 2992
0
Run Code Online (Sandbox Code Playgroud)

为什么bash在这种情况下的行为方式呢?测试命令是否未完成,因此不处理echo命令?

Jak*_*uld 46

意义&&&内在的不同.

  • 什么&&&&In &&和许多其他编程语言 - &意味着"AND".在这样的命令执行上下文中,它意味着&在这种情况下应该按顺序运行左侧和右侧的项目.
  • 什么&[1] 2992而单一2992意味着前面的命令 - 在0-st的左边 - 应该只在后台运行.

所以看看你的例子:

gndlp@ubuntu:~$ test -x examples.desktop  && echo $?
gndlp@ubuntu:~$ test -x examples.desktop  & echo $?
[1] 2992
0
Run Code Online (Sandbox Code Playgroud)

第一个命令 - 因为它是结构化的 - 实际上不返回任何东西.但是第二个命令返回一个test -x examples.desktop,其中&&指的是在后台运行的进程ID(PID),它是&第一个命令的输出.

由于第二个命令只是&&在后台运行,因此它很快就会发生,因此进程ID会立即产生并且很快就会出现.


Mak*_*oto 9

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

手册页:

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


Red*_*ket 5

看看你的命令是什么:

test -x examples.desktop  && echo $?
Run Code Online (Sandbox Code Playgroud)

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

test -x examples.desktop  & echo $?
Run Code Online (Sandbox Code Playgroud)

意味着检查是否examples.desktop可以在“后台”中执行。然后执行echo $?