Свести к минимуму скрипт оболочки (включить исходные скрипты) и удалить неиспользуемые функции

Свести к минимуму скрипт оболочки (включить исходные скрипты) и удалить неиспользуемые функции

Я вручную настраиваю скрипты инициализации Debian, чтобы оптимизировать время загрузки встроенного устройства. Пока что я сократил его вдвое только с помощью "низко висящих фруктов", т. е. небольших скриптов, которые легко понять.

Теперь у меня осталось несколько скриптов инициализации, которые в общей сложности запускаются примерно за 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

@slm's ответвдохновило меня написатьсгладить.ш.

flatten.shне будет включать весь файл для получения. Вместо этого он будет извлекать только те функции, которые определены в файле, которые фактически используются в скрипте, который выравнивается.

Это полезно, если вы храните файл "lazy.lib", который в свою очередь является источником ВСЕХ используемых вами функций. Просто используйте источник "lazy.lib" в вашем скрипте во время разработки и сгладьте его, когда закончите.

Связанный контент