셸 스크립트를 평면화하고(소스 스크립트 포함) 사용하지 않는 기능을 제거합니다.

셸 스크립트를 평면화하고(소스 스크립트 포함) 사용하지 않는 기능을 제거합니다.

나는 임베디드 장치의 부팅 시간을 최적화하기 위해 데비안 초기화 스크립트를 수동으로 조정하고 있습니다. 지금까지 나는 "낮게 매달린 과일"만으로 그것을 절반으로 줄였습니다. 이해하기 쉬운 작은 스크립트.

이제 총 실행하는 데 약 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"

잠재적인 향상?

내가 사용한 것 중 하나는 grepsed를 교체하여 보다 순수한 Bash 솔루션으로 만들 수 있습니다. 이것은 대략적인 프로토타입이기 때문에 시간을 들이지 않았습니다.

주의가 가장 필요할 두 번째 영역은 다른 파일의 소싱이 발생하고 있음을 파악하는 스크립트 기능입니다. 이를 감지하는 패턴은 상황에 따라 "조정"되어야 할 가능성이 높습니다.

답변2

@slm의 답변나에게 글을 쓰도록 영감을 주었어요flatten.sh.

flatten.sh소스로 사용할 전체 파일을 포함하지 않습니다. 대신, 파일에 정의되어 있고 실제로 평면화되는 스크립트에 사용되는 함수만 가져옵니다.

이는 사용하는 모든 기능의 소스가 되는 "lazy.lib" 파일을 보관하는 경우 유용합니다. 개발하는 동안 스크립트에서 "lazy.lib"를 소스로 사용하고 작업이 끝나면 평면화하세요.

관련 정보