Executable

以舒適的閱讀方式設置兩個或多個文件以執行(通過源)

  • March 10, 2018

在目前的 Bash 會話中,我使用以下方式來執行一組 Bash 腳本文件:

source ~/myScripts/{assignments.sh,nginx_conf.sh,php_conf.sh,drush_install.sh}

我覺得維護起來很不舒服。一些垂直收集更好。虛擬碼:

assignments.sh
nginx_conf.sh
php_conf.sh
drush_install.sh

你會如何垂直地做到這一點?

順便說一句,我不確定像這樣的源文件是最好的方法。

更新

我現在明白我的單行source操作注定要失敗,因為從 Bash 4.3.48(1) 開始,Bash 解釋器的評估source方式是它只能處理一個文件,並且將評估除此之外的任何其他文件作為第一個文件的參數(大括號集{}對此無濟於事)。

我得到的印像是與bash相反source

一個heredoc 將每個文件名放在它自己的行上,沒有其他任何東西(儘管假設文件名不包含任何像換行符一樣瘋狂的東西)並允許文件名的特定順序:

while read f; do
  source ~/myScripts/"$f"
done <<SRC_LIST
assignments.sh
nginx_conf.sh
php_conf.sh
drush_install.sh
so_forth.sh
SRC_LIST

這也避免了source file [arguments]後續文件名將被視為參數的問題assignments.sh(除非您確實指的是後續文件名??)。該列表需要手動更新文件系統上的內容。

另一種選擇是跳過列出文件並將它們全域化的乏味;這假定目錄中的所有匹配文件都可以並且應該是來源(因此不要混入其他*.sh不得來源的隨機文件)。然而,當沒有文件與 glob 匹配的邊緣情況下,這會變得複雜,在這種情況下bash,預設情況下將傳遞 in 的文字文件名~/myScripts/*.sh以獲取源,因此必須解決(臨時,如有必要)並且如果沒有任何源沒有匹配項:

REVERT=$(shopt -p nullglob)
shopt -s nullglob
for f in ~/myScripts/*.sh; do
   source "$f"
done
$REVERT

使用這種方法,文件名的命名方式需要使 glob 以正確的順序匹配它們,如果有一個順序需要獲取文件。(在 ZSH 中不需要shopt呼叫,而是for f in ~/myScripts/*.sh(N); do足以執行一個空的 glob。其他 shell 在處理 glob 的方式以及沒有匹配項時的處理方式方面會有所不同。)

引用自:https://unix.stackexchange.com/questions/422456