我想知道以下两者之间的区别:
"echo 'hello'; ls"
并且
"echo 'hello' && ls"
这是什么?它们都执行相同的操作。
我想知道以下两者之间的区别:
"echo 'hello'; ls"
并且
"echo 'hello' && ls"
这是什么?它们都执行相同的操作。
"echo 'hello' && ls"
的意思是:如果"echo 'hello'"成功运行,就执行"ls"。了解在Bash中什么是“成功”的方法,可以试试这个:$ cd /
$ echo $?
如果上一个命令运行成功,你应该会看到0。
接着,试试这个:
$ asdfdf
$ echo $?
你应该会看到一个非零值,介于1和255之间。这意味着上一个命令未成功运行。
另一方面,"echo 'hello'; ls"的意思是,无论"echo 'hello'"是否成功运行,都要执行"ls"。
"echo $?
将会给出127,其他一些shell也可能会如此。其他值将会根据错误类型是非常具体的(但在某些情况下可能会因为不同的shell而有所变化)。这个值永远不会是随机的。 - Dennis Williamsonman bash
中的“退出状态”部分。 - Emily&&
是逻辑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变量$?
告诉你最后一个执行的命令的返回状态)。
补充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
在这里,他们做同样的事情。
但是再举一个例子:
cp file target && ls
cp file target; ls
cp
成功时才会执行ls
。在第二种情况下,无论cp
成功还是失败,ls
都将被执行。