BASH 將來源檔案貼到主來源中

BASH 將來源檔案貼到主來源中

我有一個相當大的 BASH 項目,我將其分成多個文件以使其更具可讀性。因此,主文件包含許多source語句。

現在我正在 GitHub 上發布它,並為其編寫安裝程式腳本。問題是/usr/local/sbinFHS 禁止在二進位資料夾(確切地說)下建立子目錄,我不想用多個檔案(如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行未縮進,則無縮進,如您的範例所示)

相關內容