シェルスクリプトをフラット化し(ソーススクリプトを含める)、未使用の関数を削除します。

シェルスクリプトをフラット化し(ソーススクリプトを含める)、未使用の関数を削除します。

組み込みデバイスの起動時間を最適化するために、Debian の init スクリプトを手動で調整しています。これまでのところ、簡単に理解できる小さなスクリプトなど、「簡単に実行できるもの」だけで、起動時間を半分に短縮できました。

今では、実行に合計で約 20 秒かかる init スクリプトがいくつか残っています。他のスクリプトの経験に基づくと、ここでさらに 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"

潜在的な機能強化?

1 つには と を使用しましたgrepsed、これらを交換すると、より純粋な Bash ソリューションになります。これは大まかなプロトタイプなので、これを行うのに時間はかかりませんでした。

おそらく注意が必要な 2 番目の領域は、別のファイルのソースが行われていることをスクリプトが認識できるかどうかです。これを検出するパターンは、状況に応じて「調整」する必要があるでしょう。

答え2

@slm の回答私に書くきっかけを与えてくれたフラット化

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

これは、使用するすべての関数をソースするファイル「lazy.lib」を保持する場合に便利です。開発中にスクリプトで「lazy.lib」をソースし、完了したらフラット化します。

関連情報