"echo 'hello'; ls" 和 "echo 'hello' && ls" 有什么区别?(涉及IT技术)

13

我想知道以下两者之间的区别:

"echo 'hello'; ls"

并且

"echo 'hello' && ls"

这是什么?它们都执行相同的操作。


http://askubuntu.com/questions/334994/which-one-is-better-using-or-to-execute-multiple-commands-in-one-line - Ciro Santilli OurBigBook.com
4个回答

22
"

"echo 'hello' && ls"

的意思是:如果"echo 'hello'"成功运行,就执行"ls"。了解在Bash中什么是“成功”的方法,可以试试这个:

$ cd /
$ echo $?

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

接着,试试这个:

$ asdfdf
$ echo $?

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

另一方面,"echo 'hello'; ls"的意思是,无论"echo 'hello'"是否成功运行,都要执行"ls"。

"

7
不,不,不,它将不会是一个随机值。它是一个非常具体的值。它是一个“命令未找到”错误,而在Bash、zsh、ksh、dash和ash中,echo $?将会给出127,其他一些shell也可能会如此。其他值将会根据错误类型是非常具体的(但在某些情况下可能会因为不同的shell而有所变化)。这个值永远不会是随机的。 - Dennis Williamson
谢谢您的纠正。确实是前一个命令的退出状态,它从不随机。我想知道退出状态列表在哪里有记录。嗯... - Hendra Jaya
1
我相信它们通常在各个命令的 man 页面中有记录,bash 的 man 页面提供了一些一般性建议。请查看 man bash 中的“退出状态”部分。 - Emily

16

&&是逻辑AND运算符。在command1 && command2中使用它的思想是只有当command1成功时才会评估/运行command2。因此,在这里,只有当echo命令返回成功(总是如此,但你永远不知道;-)时,ls才会运行。您也可以将其编写为:

if echo 'hello'
then
  ls
fi
分号只是分隔两个命令的符号。因此,你也可以这样写:echo 'hello' ; ls
echo 'hello'
ls

因此,即使echo失败,ls也将被执行。

顺便提一下,在这个上下文中,“成功”意味着程序以类似于exit(0)的方式退出,并且返回0作为返回代码(shell变量$?告诉你最后一个执行的命令的返回状态)。


8

补充DarkDust的答案

因此,只有在echo命令返回成功时(这在这里始终是这种情况,但你永远不知道;-),才会运行ls。

好吧,并非总是如此。例如,标准输出流可能无法写入。

:; ( 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

4

在这里,他们做同样的事情。

但是再举一个例子:

cp file target && ls
cp file target; ls

在第一种情况下,只有在cp成功时才会执行ls。在第二种情况下,无论cp成功还是失败,ls都将被执行。

正如DarkDust和telent所提到的,echo确实可能会失败,尽管这通常不是脚本关心或测试的内容。 - gamen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接