linux - Bash 是编译的还是解释的?

标签 linux bash shell parsing unix

当 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/

相关文章:

PHP:浏览器只是下载文件而不是复制它

c - 带有 c 型类型转换的 GCC 警告

linux - Bash 别名在文件名中创建具有当前时间戳的文件

linux - 如何在 bash 中将数组元素初始化为 0?

python - 我目前在 Django 中提供我的静态文件。我如何使用 Apache2 来执行此操作?

linux - 在 Linux 中寻找 kstat 等价物

bash - 可以在此代码中使用 eval 完成代码注入(inject)吗?

bash - 为什么函数 ls { ls;卡在那里?

linux - 添加两个十六进制数字并在 shell 脚本中存储为十六进制数字

bash - 从另一个命令获取一些环境变量后,在远程主机上运行的 docker 容器中运行任意命令