Kiw*_*iwy 7 command-line shell
我正在bash
用作我的主要 shell,但对于其他 shell 来说,这是一个悬而未决的问题和响应,而不是bash
非常受欢迎。
如果我以交互方式输入
#original line
#wget http://something.com && unzip something && mv -f something /home/poney/
#new line
wget http://something.com ; unzip something ; mv -f something /home/poney/
Run Code Online (Sandbox Code Playgroud)
与包含这些行的脚本相比,它在执行堆、顺序、内存、解释、权限方面是否有任何区别:
#!/bin/bash
wget http://something.com
unzip something
mv -f something /home/poney/
Run Code Online (Sandbox Code Playgroud)
除了执行脚本显然比连续键入 3 个命令要短这一事实。
dev*_*ull 17
是的,有很大的不同。 &&
是短路的,因此仅当前一个命令返回并返回退出代码为 时,才会执行后续命令0
。
引用手册:
表达式 1
&&
表达式 2Run Code Online (Sandbox Code Playgroud)True if both expression1 and expression2 are true.
另一方面,脚本包含
expression1
expression2
Run Code Online (Sandbox Code Playgroud)
即使第一个失败,也会执行第二个表达式。(除非您通过说 指定脚本以在错误时退出set -e
。)
编辑:关于您的评论是否:
command1; command2
Run Code Online (Sandbox Code Playgroud)
是相同的:
command1
command2
Run Code Online (Sandbox Code Playgroud)
答案通常是。Bash 在评估任何一个语句块之前解析整个语句块。一种 ; 不会导致上一个命令被评估。如果前一个命令对后续命令的解析方式产生影响,那么您会注意到差异。
考虑一个包含别名的文件,我们称之为alias
,并带有一个条目:
alias f="echo foo"
Run Code Online (Sandbox Code Playgroud)
现在考虑一个包含以下内容的脚本:
shopt -s expand_aliases
source ./alias
f
Run Code Online (Sandbox Code Playgroud)
另一个包含:
shopt -s expand_aliases; source ./alias; f
Run Code Online (Sandbox Code Playgroud)
那么您可能认为两者都会产生相同的输出。
答案是不。第一个会产生,foo
但第二个会报告:
... f: command not found
Run Code Online (Sandbox Code Playgroud)
进一步澄清,这不是expand_aliases
导致问题的原因。问题是由于以下语句:
alias f="echo foo"; f
Run Code Online (Sandbox Code Playgroud)
将被一次性解析。外壳并不真正知道是什么f
,这会导致解析器窒息。
小智 6
是的,&&
是条件。仅当前一个返回0
(没有错误结束)时,后面的命令才会启动。另一方面,您的脚本没有此控件,因此如果例如。wget 以错误结束,它将继续并尝试解压缩和移动任何内容..
您的脚本的 Onliner 是:
wget http://something.com ; unzip something ; mv -f something /home/poney/
Run Code Online (Sandbox Code Playgroud)