经过一番谷歌搜索后,我找到了一种将 BASH 脚本编译为二进制可执行文件的方法(使用shc
)。
我知道shell是一种解释性语言,但是这个编译器是做什么的呢?它会以任何方式提高我的脚本的性能吗?
答案1
为了回答标题中的问题,编译的 shell 脚本可能会提高性能 - 如果编译的结果代表解释的结果,而不必一遍又一遍地重新解释脚本中的命令。参见例如ksh93
的shcomp
或者zsh
的zcompile
。
但是,shc
不会以这种方式编译脚本。它并不是真正的编译器,而是一个脚本“加密”工具,具有各种有效性可疑的保护技术。当您使用 编译脚本时shc
,结果是一个二进制文件,其内容无法立即读取;当它运行时,它会解密其内容,并使用解密的脚本运行脚本预期使用的工具,从而使原始脚本易于检索(它在解释器的命令行上完整传递,并带有额外的空格,试图使比较难找到)。因此,整体性能总是会更差:除了运行原始脚本所需的时间之外,还需要设置环境和解密脚本所需的时间。
答案2
经过一番谷歌搜索后,我找到了一种将 BASH 脚本编译为二进制可执行文件的方法(使用
shc
)。
非常不幸的是,这个shc
装置仍然出现在谷歌搜索结果中,即使它已经被彻底揭穿了这么多年:shc
它不是一个编译器,而且它并不能防止脚本源代码被查看和“窃取”。
如果有什么不同的话,shc 比它必须的更愚蠢,因为在整理脚本源之后,它只是将其作为参数传递给bash -c
,这意味着它对/proc/<pid>/cmdline
任何用户都可见,而不仅仅是运行脚本的用户。这也遇到了 Linux 对单个命令行参数的长度限制(128k 字节)。但更荒谬的是,该论证的第一部分充满了空格,因此它不会出现在ps
;-)
它会以任何方式提高我的脚本的性能吗?
是的,您的脚本可能根本无法工作,这意味着它将更快终止。
答案3
一般来说,没有办法编译shell脚本,因为在运行时可以通过多种方法引入新的源文本,因此绕过了编译阶段。该新源将无法与编译的函数或变量进行交互。
创建运行时源的两种方法是:
获取自编译原始脚本以来可能已创建或修改的辅助文件。
在运行时在字符串中构造任意命令并执行它。