shell命令中"&&"的目的是什么?

Cap*_*ain 333 syntax bash shell command-line

据我所知,&在命令之后使用是为了在后台运行它.

&用法示例:tar -czf file.tar.gz dirname &

但是怎么样&&?(看看这个例子:https://serverfault.com/questions/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188)

gir*_*uid 379

&&让你根据上一个命令是否成功完成做一些事情 - 这就是你倾向于把它看作链接的原因do_something && do_something_else_that_depended_on_something.


plu*_*dra 364

此外,你还有||一个逻辑或者,;它也只是一个不关心命令发生的事情的分隔符.

$ false || echo "Oops, fail"
Oops, fail

$ true || echo "Will not be printed"
$  

$ true && echo "Things went well"
Things went well

$ false && echo "Will not be printed"
$

$ false ; echo "This will always run"
This will always run
Run Code Online (Sandbox Code Playgroud)

有关此内容的一些详细信息,请参阅Bash手册中的命令列表.

  • @Dan 这是一个糟糕的把戏。只有当你能保证“&&”之后的命令成功时,它才会按预期工作。`如果命令;然后命令;否则命令;fi` 并没有明显变长,并且将始终按预期工作。 (10认同)
  • 还有这个“伎俩”。`命令 && 回显“命令有效”|| echo“命令失败”` (5认同)
  • 也许你想添加`false && echo"将不会打印"`. (3认同)

Aar*_*all 98

命令行 - 目的是&&什么?

在shell中,当你看到

$ command one && command two
Run Code Online (Sandbox Code Playgroud)

目的是执行&&仅在第一个命令成功时执行的命令.这是Posix shell的惯用语,不仅仅是在Bash中找到的.

如果第一个进程失败,它打算阻止第二个进程的运行.

进程返回0表示true,其他正数表示false

程序在退出时返回信号.如果它们成功退出,它们应返回0,否则返回大于零.这允许进程之间的有限量的通信.

&&被称为AND_IFPOSIX壳语法,这是一个的一部分and_or列表的命令,其中还包括||其为OR_IF具有相似的语义.

语法符号:

%token  AND_IF    OR_IF    DSEMI
/*      '&&'      '||'     ';;'    */
Run Code Online (Sandbox Code Playgroud)

语法:

and_or           :                         pipeline
                 | and_or AND_IF linebreak pipeline
                 | and_or OR_IF  linebreak pipeline
Run Code Online (Sandbox Code Playgroud)

两个运算符具有相同的优先级,并从左到右进行求值(它们是左关联的)例如,以下内容:

$ false && echo foo || echo bar
$ true || echo foo && echo bar
Run Code Online (Sandbox Code Playgroud)

两者都是回声AND_IF.

  1. 在第一种情况下,false是以状态退出的命令 &&

    $ false
    $ echo $?
    1
    
    Run Code Online (Sandbox Code Playgroud)

    这意味着OR_IF不运行(即短路||).然后and_or执行该命令.

  2. 在第二种情况下,真正的退出代码为 AND-OR

    $ true
    $ echo $?
    0
    
    Run Code Online (Sandbox Code Playgroud)

    因此"&&"不执行,然后"||"执行.


Nig*_*son 31

'&&'的一个常见用法是使用autotools编译软件.例如:

./configure --prefix=/usr && make && sudo make install
Run Code Online (Sandbox Code Playgroud)

基本上,如果配置成功,则运行make以进行编译,如果成功,则以root身份运行make以安装程序.当我确信事情会起作用时,我会使用它,它允许我做其他重要的事情,比如看看stackoverflow而不是'监视'进度.

有时我真的被带走了......

tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf
Run Code Online (Sandbox Code Playgroud)

我这样做的时候,例如从头开始制作一个Linux框.

  • REPL很好,但是对于脚本,我更喜欢Bash使用`set -o errexit`。 (2认同)

小智 19

&&字符串命令在一起 连续命令仅在前面的命令成功时执行.

同样,||如果前一个命令失败,将允许执行连续命令.

请参阅Bash Shell编程.


aln*_*lno 8

看例子:

mkdir test && echo "Something" > test/file
Run Code Online (Sandbox Code Playgroud)

Shell将尝试创建目录test,然后,只有在成功的情况下才会尝试在其中创建文件.

因此,如果其中一个步骤失败,您可能会中断一系列步骤.


Xia*_* Li 7

command_1 && command_2:只有在command_1执行成功时才执行command_2.

command_1 || command_2:仅在command_1未成功执行时执行command_2.

感觉类似于在主流编程语言中执行'if'条件的情况,如if (condition_1 && condition_2){...}条件_2,如果condition_1是false,则将省略,如果condition_1是,if (condition_1 || condition_2){...}则将省略condition_2 true.看,这与你用于编码的技巧相同:)


Nic*_*ick 6

如果第一个语句成功结束,则执行第二个语句.像if语句:

 if (1 == 1 && 2 == 2)
  echo "test;"
Run Code Online (Sandbox Code Playgroud)

如果1 == 1则首次尝试,如果为真则检查2 == 2