シェルスクリプト(ソーススクリプトを含む)を平面化し、未使用の機能を削除します。

シェルスクリプト(ソーススクリプトを含む)を平面化し、未使用の機能を削除します。

私は手動で組み込みデバイスの起動時間を最適化するためにDebian initスクリプトを調整しています。これまでは「低くぶら下がった果物」で半分に切りました。スクリプトが小さいほど理解しやすくなります。

これで、実行に合計20秒かかる初期化スクリプトだけが残りました。他のスクリプトを使った経験に基づいて、ここでは5〜10秒の追加時間を得ることができます。問題は、これらのスクリプトが/lib/init/従うのが難しいいくつかのヘルパースクリプト(mount-functions.sh最初の犯人)からソースとして提供されるため、私には少し難しいことです。

残りのスクリプトをより簡単に理解して最適化するために、これらのinitスクリプトを「前処理」して、ファイルを取得するたびにスクリプト自体にインライン化する(もちろん再帰的に)方法を望んでいます。未使用の関数を削除してコードをよりきれいにします。そのようなツールがありますか?

答え1

このようにすることができます。軽くテストしてみただけで全体的な概念は妥当だと思います。

はい

次のファイルディレクトリがあるとします。

$ ls -l
total 16
-rwxrwxr-x 1 saml saml 268 Oct  4 17:44 expander.bash
-rw-rw-r-- 1 saml saml  18 Oct  4 16:49 src_1.bash
-rw-rw-r-- 1 saml saml  20 Oct  4 16:50 src_2.bash
-rwxrwxr-x 1 saml saml 119 Oct  4 16:49 top.bash

ファイルtop.bashは次のとおりです。

$ cat top.bash 
#!/bin/bash

echo "1"
echo "2"
echo "3"
echo "4"

. src_1.bash

echo "15"
echo "16"

. src_2.bash

echo "27"
echo "28"

次のスクリプトを使用してexpander.bash「拡張」できますtop.bash

#!/bin/bash

while read -r line; do
  if echo "$line" | grep -q '\. .*'; then
    file=$(echo "$line" | sed 's/\. //')
    echo "### below sourced from: $file"
    cat $file
    echo "### above sourced from: $file"
    continue
  fi
  printf "%s\n" "$line"
done < top.bash

実行例

$ ./expander.bash 
#!/bin/bash

echo "1"
echo "2"
echo "3"
echo "4"

### below sourced from: src_1.bash
echo "6"
echo "7"
### above sourced from: src_1.bash

echo "15"
echo "16"

### below sourced from: src_2.bash
echo "17"
echo "18"
### above sourced from: src_2.bash

echo "27"
echo "28"

潜在的な改善が必要ですか?

grepそして私が使用しているsed場合は、それを交換してより純粋なBashソリューションにすることができます。おおよそのプロトタイプだったので、これを行うには時間がかかりませんでした。

2番目に懸念されるのは、発生している他のファイルのソースを確認するスクリプトの能力です。これを検出するモードを状況に合わせて「調整」する必要があるかもしれません。

答え2

@slmの答え私に書くようにインスピレーションを与えてくださいflatten.sh

flatten.shインポートするファイル全体は含まれません。代わりに、フラット化されたスクリプトで実際に使用されるファイルで定義されている関数のみを取得します。

使用するすべての機能を提供する「lazy.lib」ファイルをアーカイブすると便利です。開発中にスクリプトの「lazy.lib」を参照し、完了したら平坦化してください。

関連情報