Executable
以舒適的閱讀方式設置兩個或多個文件以執行(通過源)
在目前的 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 的方式以及沒有匹配項時的處理方式方面會有所不同。)