
저는 상당히 큰 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.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
예에서와 같이 줄이 들여쓰기되지 않은 경우 없음).