与使用有什么区别;并执行脚本

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)

PS:

除了执行脚本显然比连续键入 3 个命令要短这一事实。

dev*_*ull 17

是的,有很大的不同。 &&短路的,因此仅当前一个命令返回并返回退出代码为 时,才会执行后续命令0

引用手册

表达式 1 && 表达式 2

True if both expression1 and expression2 are true.
Run Code Online (Sandbox Code Playgroud)

另一方面,脚本包含

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,这会导致解析器窒息。

  • @terdon Bash 在评估任何一个语句块之前解析整个语句块。`;` 不会导致上一个命令被 _evaluated_。因此,解析器在遇到未知命令时会窒息。 (2认同)

小智 6

是的,&&是条件。仅当前一个返回0(没有错误结束)时,后面的命令才会启动。另一方面,您的脚本没有此控件,因此如果例如。wget 以错误结束,它将继续并尝试解压缩和移动任何内容..

您的脚本的 Onliner 是:

wget http://something.com ; unzip something ; mv -f something /home/poney/
Run Code Online (Sandbox Code Playgroud)