
我有一個相當大的 BASH 項目,我將其分成多個文件以使其更具可讀性。因此,主文件包含許多source
語句。
現在我正在 GitHub 上發布它,並為其編寫安裝程式腳本。問題是/usr/local/sbin
FHS 禁止在二進位資料夾(確切地說)下建立子目錄,我不想用多個檔案(如main.bash
config.bash
等)弄亂二進位資料夾。
作為一個解決方案,我認為如果安裝程式腳本將這些文件合併在一起,我將獲得一個大型的整體 BASH 文件,它可以放置在系統上的任何位置。
問題是:如何用source
來源檔案的內容替換主腳本中的所有語句?
例子:
包含.bash
echo "bar"
主.bash
echo "foo"
source included.bash
產生的整體文件
echo "foo"
echo "bar"
答案1
該腳本可能被稱為make-monolithic.bash
,它將遍歷 in 中的每一行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
行未縮進,則無縮進,如您的範例所示)