BASH 소스 파일을 기본 소스에 붙여넣기

BASH 소스 파일을 기본 소스에 붙여넣기

저는 상당히 큰 BASH 프로젝트를 가지고 있는데, 이를 더 쉽게 읽을 수 있도록 여러 파일로 분할했습니다. 결과적으로 기본 파일에는 많은 source명령문이 포함됩니다.

이제 GitHub에 공개하고 이에 대한 설치 프로그램 스크립트를 작성하고 있습니다. 문제는 바이너리 폴더(정확히 ) 아래에 하위 디렉터리를 생성하는 것이 FHS에 의해 금지되어 있으며 , 등과 /usr/local/sbin같은 여러 파일로 바이너리 폴더를 엉망으로 만들고 싶지 않다는 것입니다 .main.bash config.bash

해결책으로 설치 프로그램 스크립트가 이러한 파일을 병합하면 시스템의 어느 곳에나 배치할 수 있는 대규모의 단일 BASH 파일을 얻게 될 것이라고 생각했습니다.

문제는: source기본 스크립트의 모든 명령문을 소스 파일의 내용으로 어떻게 대체할 수 있습니까?

예:

include.bash

echo "bar"

main.bash

echo "foo"
source included.bash

결과 모놀리식 파일

echo "foo"
echo "bar"

답변1

라고 불리는 이 스크립트는 make-monolithic.bash각 줄을 살펴 보고 명령문 main.bash을 찾습니다 source. 일치하는 항목이 없으면 해당 줄을 파일에 복사합니다 monolithic.bash. 그러나 행이 발견되면 파일 이름이 추출되고 해당 파일의 내용이 원래 행 대신 source에 복사됩니다 .monolithic.bashsource

#!/usr/bin/env bash

readonly MAIN="main.bash"
readonly MONOLITHIC="monolithic.bash"

[ -f "$MONOLITHIC" ] && cp "$MONOLITHIC" "${MONOLITHIC}.bak"

## to extract sourced filename
regex='^\([[:space:]]*\)source[[:space:]]\+\([^[:space:]]\+\)[[:space:]]*$'

IFS=$'\n'  ## retain whitespace

while read main_line; do
    sourced=$(echo "$main_line" | sed -n "s/$regex/\2/p")
    if [ -n "$sourced" ]; then
        indent=$(echo "$main_line" | sed -n "s/$regex/\1/p")
        while read sourced_line; do
            echo "${indent}${sourced_line}" >> "$MONOLITHIC"
        done < "$sourced"
    else
        echo "$main_line" >> "$MONOLITHIC"
    fi
done < "$MAIN"

unset IFS

[ -f "${MONOLITHIC}.bak" ] && rm "${MONOLITHIC}.bak"
  • 제공된 예제에서 테스트되었습니다.
  • 또한 source줄 에서 발생할 수 있는 공백 문제를 정상적으로 무시합니다.
  • 플러스: 명령문 이전에 발견된 것과 동일한 양의 들여쓰기를 소스 파일의 내용에 자동으로 적용합니다 source( source예에서와 같이 줄이 들여쓰기되지 않은 경우 없음).

관련 정보