Shell

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

  • October 10, 2019

我正在手動調整 Debian 初始化腳本以優化嵌入式設備的啟動時間。到目前為止,我只用“低垂的果實”將它減少了一半,即。易於理解的較小的腳本。

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

為了使那些剩餘的腳本更容易理解以便我可以優化它們,我想要一些方法來“預處理”這些初始化腳本,以便每當它們獲取一個文件時,它就會內聯到腳本本身(當然是遞歸的) ),並刪除未使用的函式以整理程式碼。有這個工具嗎?

你可以做這樣的事情。我只是對它進行了輕微的測試,但我認為總體概念是合理的。

例子

假設您有以下文件目錄:

$ 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"

潛在的增強?

對於我使用的一個grepand sed,可以將它們換掉以使其成為更純粹的 Bash 解決方案。我沒有花時間這樣做,因為這是一個粗略的原型。

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

引用自:https://unix.stackexchange.com/questions/93614