インターネット検索後にBASHスクリプトをバイナリ実行可能ファイルにコンパイルする方法を見つけましたshc
(
私はシェルが解釈された言語であることを知っていますが、このコンパイラは何をしますか?どのように私のスクリプトのパフォーマンスが向上しますか?
答え1
タイトルの質問に答えるために、コンパイルされたシェルスクリプトはパフォーマンスを向上させることができます。つまり、スクリプトのコマンドを繰り返し再解釈する必要なく、コンパイルされた結果が解釈された結果を示す場合です。たとえば、参照してください。ksh93
~のshcomp
またはzsh
~のzcompile
。
ただし、shc
スクリプトはこのようにコンパイルされません。実際にはコンパイラではなく、効率が疑われるさまざまな保護技術を備えたスクリプト「暗号化」ツールです。コンパイルされたスクリプトを使用すると、shc
結果は実行時にコンテンツをすぐに読み取れないバイナリファイルになり、内容を復号化し、復号化されたスクリプトを使用してスクリプトが使用したいツールを実行して元のスクリプトを簡単に作成できます。検索可能(比較を見つけるのを難しくするために、余分なスペースを含むインタプリタのコマンドラインから全体が渡されます。)したがって、全体的なパフォーマンスは常に悪くなります。元のスクリプトを実行するのに必要な時間に加えて、環境を設定してスクリプトを復号するのに必要な時間もあります。
答え2
インターネット検索後にBASHスクリプトをバイナリ実行可能ファイルにコンパイルする方法を見つけました
shc
(
shc
このデバイスが長年にわたって完全に真実ではないことが判明しているにもかかわらず、このデバイスがまだGoogleの検索結果に表示されるのは非常に不幸です。このデバイスshc
はコンパイラではありません。スクリプトソースコードを見て「盗む」ことを防ぐことはできません。。
shcはスクリプトソースを照合した後に引数として渡すため、必要以上に愚かです。つまり、スクリプトを実行しているユーザーだけでなく、すべてのユーザーに表示されることを意味しますbash -c
。/proc/<pid>/cmdline
これはまた、単一のコマンドライン引数の長さ(128kバイト)のLinux制限に達します。しかし、もっと面白いことは、引数の最初の部分が空白で埋められて表示されないことですps
;-)
どのように私のスクリプトのパフォーマンスが向上しますか?
はい、スクリプトがまったく機能しない可能性があります。つまり、スクリプトがより早く終了することを意味します。
答え3
一般的に言えば、実行時に新しいソーステキストを導入してコンパイルステップをバイパスする方法が多いため、シェルスクリプトをコンパイルする方法はありません。新しいソースは、コンパイルされた関数や変数と対話できません。
ランタイムソースを生成する2つの方法は次のとおりです。
ソーススクリプトがコンパイルされてから作成または変更された可能性がある補助ファイルを取得します。
文字列でランダムなコマンドを設定し、実行時に実行します。