저는 임베디드 장치의 부팅 시간을 최적화하기 위해 Debian init 스크립트를 수동으로 조정하고 있습니다. 지금까지는 "낮게 매달린 과일"로 반으로 잘라냈습니다. 스크립트가 작을수록 이해하기가 더 쉽습니다.
이제 실행하는 데 총 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의 답변나에게 글을 쓰도록 영감을 주세요flatten.sh.
flatten.sh
가져올 전체 파일은 포함되지 않습니다. 대신, 평면화되는 스크립트에서 실제로 사용되는 파일에 정의된 함수만 가져옵니다.
사용하는 모든 기능을 제공하는 "lazy.lib" 파일을 보관하면 유용할 것입니다. 개발하는 동안 스크립트에서 "lazy.lib"를 참조하고 완료되면 평면화하세요.