スクリプトを実際に実行せずに実行するときに、スクリプトが使用するすべてのプログラムを一覧表示する方法を見つけようとしています。
私は次のような速くて汚い冗談を書いた。
# fill an array with all the useful words except variables, options, brackets, quotes
readarray -t list <<<$( grep -v '^#' script.sh | sed 's/[0-9a-zA-Z_\-]*=//g ; s/\${.*}//g ; s/\$(//g ; s/[)'\"\'\`']//g ; s/ --*.//g ' )
# for every word in array show info with `type' and clean the output again
for p in "${list[@]}" ; do type "${p}" ; done 2>&1 | grep -v -e '^bash:' -e 'shell keyword' -e 'shell builtin' | sort | uniq | sed 's/^.* //g ; s/[\(\)]//g'
私の考えの問題は次のとおりです。
- プログラムがインストールされていないと「Enter」が失敗します。
- ここにはキーワードを含めることも、プログラムにすることもできます。
- スクリプトが正しく書かれていないと、難易度が高くなる可能性があります(「shellcheck」が役に立つ可能性があります)。
- 外部設定ファイルとライブラリを追跡しないでください(ilkkachuコメントを参照)。
より良い解決策はありますか?
答え1
投稿#16からhttps://www.unix.com/shell-programming-and-scripting/268856-how-pre-check-scrutinize-all-my-shell-scripts.html私は150行のPerlスクリプトを公開しました。p1.txtこれは便利な出発点になります。リンクも追加しました。より完璧で複雑なシェルパーサー
スレッド全体をチェックするのが最善です。他の視点も興味深いかもしれません。
頑張って...乾杯、drl
答え2
これは簡単なことではありません。あなたはすでにこれらの困難のいくつかを確認しています。テキストベースの解析は、エラーが発生しやすく、バイパスしやすく(選択した場合)、ほぼ確実に不完全です。
Bashには、実際にスクリプトを実行せずにスクリプトを解析する「set」組み込み関数があります。これは役に立ちますが、それも制限的です。
[set] -n Read commands but do not execute them. This may be used to check a shell script for syntax errors. This is ignored by interactive shells.
スクリプトでテストするには、set -n
スクリプトの先頭に追加して実行します。
strace
非常に便利ですが、実際に実行するにはスクリプトが必要です。これは、スクリプトが安全であると確信しているときに行うことです。