编译后的 shell 脚本对性能更好吗?

ada*_*009 21 performance shell compiling compiler

经过一番谷歌搜索,我找到了一种将 BASH 脚本编译为二进制可执行文件的方法(使用shc)。

我知道 shell 是一种解释性语言,但是这个编译器有什么作用呢?它会以任何方式提高我的脚本的性能吗?

Ste*_*itt 55

为了回答标题中的问题,编译的 shell 脚本可能会提高性能——如果编译的结果代表解释的结果,而不必一遍又一遍地重新解释脚本中的命令。参见例如ksh93'sshcompzsh'szcompile

但是,shc不会以这种方式编译脚本。它不是真正的编译器,而是一个脚本“加密”工具,具有各种有效性可疑的保护技术。当您使用 编译脚本时shc,结果是一个二进制文件,其内容不能立即读取;当它运行时,它会解密其内容,并使用解密的脚本运行该脚本旨在用于的工具,从而使原始脚本易于检索(它在解释器的命令行上完整传递,并带有额外的间距以试图使比较难找)。所以整体性能总是会更差:除了运行原始脚本所花费的时间之外,还有设置环境和解密脚本所花费的时间。

  • 老实说,如果性能是一个大问题,您可能不应该首先查看 shell 脚本。 (27认同)
  • @Shadur 此外,shell 脚本多次调用执行繁重工作的已编译程序,因此无论如何它并没有太大的提升。例如,如果您有一个调用 awk、sed 和 grep 的脚本,那么它们都会被编译。 (12认同)
  • @CaptainMan:如果你用编译语言编程,你会自己读取数据并使用正则表达式库而不是多个单独进程的 fork+exec,每个进程都必须为新进程支付启动开销,并且动态链接(这是在短文件上运行 `grep` 的总成本的重要部分)。此外,对于大量数据,避免在进程之间传输数据、消耗一些整体内存带宽以及内核中内核之间的同步。您不会期望 shell 脚本编译器会这样做,因此 Shadur 的观点是:完全避免 (5认同)
  • 所以本质上,`shc` 的唯一有效目的是为那些编写不安全代码并想要隐藏其硬编码密码和漏洞的人,或者试图以尽可能少的努力隐藏明显恶意软件的脚本小子? (4认同)
  • Comeau Computing 曾经销售 [CCsh](http://web.archive.org/web/20181204010521/http://www.comeaucomputing.com/faqs/ccshfaq.html),但他们倒闭了,我不知道任何其他 shell 编译器。 (3认同)

小智 34

经过一番谷歌搜索,我找到了一种将 BASH 脚本编译为二进制可执行文件的方法(使用shc)。

非常不幸的shc是,即使这些年来它已被完全揭穿,该装置仍然出现在 google 搜索结果中:shc它不是编译器,并且不会阻止脚本的源代码被查看和“被盗”

如果有的话, shc 甚至比它必须的更愚蠢,因为在解开脚本源之后,它只是将它作为参数传递给bash -c,这意味着它对/proc/<pid>/cmdline任何用户都是可见的,而不仅仅是运行脚本的用户。这也遇到了 Linux 对单个命令行参数(128k 字节)的长度限制。但是为了让事情变得更加荒谬,该论点的第一部分充满了空格,因此它没有出现在ps;-)

它会以任何方式提高我的脚本的性能吗?

是的,您的脚本可能根本无法运行,这意味着它会更快终止。

  • 它目前的维护者一直在从事大量的“营销”工作,包括为其创建一个维基百科页面,该页面以某种方式幸存下来...... (4认同)
  • 用空格填充是无用的,因为可以很容易地告诉 `ps` 显示完整的命令行长度,并且在将 *eg* 管道传输到 `grep` 时会自动执行此操作。 (2认同)

Pau*_*ant 5

一般来说,没有办法编译shell脚本,因为在运行时可以通过多种方法引入新的源文本,因此绕过了编译阶段。该新源将无法与编译的函数或变量进行交互。

创建运行时源的两种方法是:

源自原始脚本编译后可能已创建或修改的辅助文件。

在运行时构造一个字符串中的任意命令,并执行它。