扁平化 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”,并在完成后将其展平即可。

相关内容