扁平化 shell 腳本(包括來源腳本)並刪除未使用的函數

扁平化 shell 腳本(包括來源腳本)並刪除未使用的函數

我正在手動調整 Debian 初始化腳本以優化嵌入式設備的啟動時間。到目前為止,我只是用「容易實現的成果」將其減少了一半。較小的腳本易於理解。

現在我只剩下一些初始化腳本,總共需要大約 20 秒才能運行。根據其他腳本的經驗,我可以在這裡再多爭取 5 到 10 秒的時間。問題是這些腳本對我來說有點難以理解,因為它們來源了幾個/lib/init/難以遵循的幫助腳本(mount-functions.sh是第一個罪魁禍首)。

為了使那些剩餘的腳本更容易理解,以便我可以優化它們,我想要某種方法來「預處理」這些初始化腳本,以便每當它們獲取檔案時,它都會內聯到腳本本身中(當然是遞歸的) ),並刪除未使用的函數以使程式碼變得整潔。有這個工具嗎?

答案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"

潛在的增強功能?

對於我使用的grepsed,可以將它們替換以使其成為更純粹的 Bash 解決方案。我沒有花時間做這件事,因為這是一個粗糙的原型。

最可能需要注意的第二個方面是腳本能夠確定正在發生另一個文件的來源。偵測到這種情況的模式可能需要根據您的情況進行「調整」。

答案2

@slm 的回答啟發我寫作展平.sh

flatten.sh將不包括要取得的整個文件。相反,它只會獲取文件中定義的那些函數,這些函數實際上在正在扁平化的腳本中使用。

如果您保留一個檔案“lazy.lib”,該檔案反過來又提供您使用的所有函數,這將非常有用。只需在開發時在腳本中引用“lazy.lib”,並在完成後將其展平即可。

相關內容