当 Bash 运行您的脚本时,它是将其解析为代码,还是将其解析为命令? Bash 是否真的像 Python 那样编译和运行您的脚本,或者 Bash 只是通过其命令解析器运行它?
最佳答案
Bash 是一种单程解释器,这意味着它一次读取一个命令,然后解释并运行它。其他类型的 shell - sh、ksh、zsh、csh 等也是如此。
这是一个例子。我有一个名为 test.sh
的 3 行脚本,如下所示:
echo one
echo two
'
当作为 bash test.sh
运行时,它给出以下输出:
one
two
test.sh: line 3: unexpected EOF while looking for matching `''
test.sh: line 4: syntax error: unexpected end of file
它成功运行了第一个和第二个命令,然后遇到悬挂的单引号并抛出错误。
假设我们用 Perl 编写相同的代码,test.pl
:
print "one\n"
print "two\n"
'
并使用 perl test.pl
运行它。我们得到:
syntax error at test.pl line 2, near "print"
Can't find string terminator "'" anywhere before EOF at test.pl line 3.
因此,它根本没有运行前两行,尽管它们在语法上是正确的。那是因为 Perl 进行了两次传递。在第一遍中,它进行语法检查并将脚本转换为内部形式。在第二遍中,它运行它。
shell 的单次执行的简单性也是它最大的限制。容忍语法错误,甚至根本无法运行,这使得使用 shell 语言构建大型且健壮的代码变得困难。然而,shell 脚本是快速和一次性代码的理想选择,尤其是使用大量命令行实用程序的代码。
相关:
关于linux - Bash 是编译的还是解释的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41755292/