"echo'hello'; ls"vs"echo'hello'&& ls"之间的区别?

nev*_*ame 13 bash

我想知道它们之间有什么区别

"echo 'hello'; ls"
Run Code Online (Sandbox Code Playgroud)

"echo 'hello' && ls"
Run Code Online (Sandbox Code Playgroud)

是什么?他们都做同样的事情

Hen*_*aya 22

"echo'hello'&& ls"表示:如果"echo'hello'"成功运行,则执行"ls".要了解什么是bash中的"成功".试试这个 :

bash> cd/
bash> echo $?

如果上一个命令成功运行,您应该看到0

在那之后,试试这个:

bash> asdfdf
bash> echo $?

您应该看到介于1和255之间的非零值.这意味着上一个命令未成功运行

另一方面,"echo'hello'; ls"表示执行"ls"是否"echo'hello'"成功运行或不成功.

  • 不,*不*,**否**它将*不是*随机值.这是一个非常*特定的*值.这是一个"命令未找到"的错误,`echo $?`会给你127 Bash,zsh,ksh,dash和ash以及其他可能.其他值对于错误类型将是*特定*(但在某些情况下,它们可能会因shell而异).值为*never*,*ever***random**. (7认同)

Dar*_*ust 16

&&是逻辑AND运算符.其使用的想法command1 && command2是command2仅在command1成功时被评估/运行.所以这里ls只有在echo命令返回成功的情况下才能运行(这里总会如此,但你永远不知道;-).你也可以这样写:

if echo 'hello'
then
  ls
fi
Run Code Online (Sandbox Code Playgroud)

分号只分隔两个命令.所以你也可以这样写echo 'hello' ; ls:

echo 'hello'
ls
Run Code Online (Sandbox Code Playgroud)

因此ls即使echo失败也将执行.

顺便说一句,在这种情况下成功意味着程序退出了类似的东西exit(0),因此返回0作为返回代码($?shell变量告诉你最后执行的命令的返回状态).


tel*_*ent 8

为了补充DarkDust的答案:

所以这里ls只有在echo命令返回成功时才会运行(这里总会如此,但你永远不知道;-).

好吧,并非总是如此.例如,标准输出流可能是不可写的

:; ( echo "foo" && touch /tmp/succeeded) >/dev/full
bash: echo: write error: No space left on device
:; ls -l /tmp/succeeded
ls: cannot access /tmp/succeeded: No such file or directory
Run Code Online (Sandbox Code Playgroud)