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

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

더 읽기 쉽게 만들기 위해 여러 파일로 분할한 상당히 큰 BASH 프로젝트가 있습니다. 따라서 기본 파일에는 많은 source명령문이 포함되어 있습니다.

이제 GitHub에 게시하고 이에 대한 설치 프로그램 스크립트를 작성하고 있습니다. 문제는 FHS가 바이너리 폴더 아래에 하위 디렉터리를 생성하는 것을 금지하고(정확하게 말하면) 바이너리 폴더를 여러 파일(예: 등)로 복잡하게 만들고 /usr/local/sbin싶지 않다는 것입니다 .main.bash config.bash

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

문제는 source기본 스크립트의 모든 명령문을 소스 파일의 내용으로 바꾸는 방법입니다.

예:

.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.bash원래 행 대신 에 복사됩니다 source.

#!/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귀하의 예에서와 같이 행이 들여쓰기되지 않은 경우 들여쓰기 없음).

관련 정보