
我的目錄中有 shell 腳本~/Shell
,每當 Bash 作為我常用的使用者帳戶啟動時,我都希望執行這些腳本。所以我所做的是將以下內容添加到~/.bashrc
:
for i in `find ~/Shell/ -name "*.sh"`
do
sh $i
done
.sh
但是,無論出於何種原因,我的目錄中具有檔案副檔名的檔案中包含的函數~/Shell
都不會自動載入。例如,我abash
在~/Shell/bash.sh
文件中呼叫了一個函數,並abash
從新用戶終端運行時出現錯誤,指出未找到該命令。
我知道我可以手動列出目錄中的所有文件,~/Shell
並在它們前面加一個點,以便在 Bash 啟動時執行它們。例如,我的文件中曾經有這樣的內容~/.bashrc
:
. ~/Shell/bash.sh
. ~/Shell/cd.sh
. ~/Shell/emerge.sh
...
它工作得很好,但我寧願用一個for
循環來執行此操作,因為這意味著如果我添加任何新的 shell 腳本,~/Shell
我不必擔心將它們添加到~/.bashrc
.
我現在也嘗試過:
for i in `find -name "~/Shell/*.sh"`
do
sh $i
done
和:
for i in "~/Shell/*.sh"
do
sh $i
done
和:
for i in `find -name '~/Shell/*.sh'`
do
sh $i
done
沒有成功。
答案1
把這個放在你的.bashrc
:
for rc in ~/Shell/*.sh
do
. "$rc"
done
然後你就可以去參加比賽了!
一些注意事項:
bash
(and zsh
etc)指令source
雖然可讀,但不是通用的,也不存在於dash
我所知道的最正確的 shell 中。就目前而言,相同的程式碼可用於將程式碼載入到幾乎任何 bourne-shell 衍生產品中。
直接源自 shell 的檔案的傳統命名約定是使用後綴rc
or .rc
(如.bashrc
)。 rc
代表“運行命令”。該.sh
副檔名通常用於可執行腳本程式。 (這些都是僅有的約定——而不是規則。
答案2
幾個問題:
- 為了工作,波形符需要不被引用。請改用 $HOME。
- 為了工作,* 也需要取消引用。查找時不需要。
/
檔案名稱(“~/Shell/”)中不應該有用於查找的內容。- 由於檔案需要載入而不是執行,所以sh應該改為source。
嘗試這個:
for i in $(find "$HOME/Shell/" -iname "*.sh")
do
source "$i"
done
編輯:
上面的選項無法處理帶有空格、換行符或有問題字元的檔案名稱。為了解決這個問題,我們可以使用 find 的全部功能,如下所示:
while IFS= read -r -d $'\0' file; do
source "$file"
done < <(find "$HOME/Shell/" -name "*.sh" -type f -print0)
筆記:
帶有簡單星號的解決方案*
將不包含子目錄。
使用星號的完整解決方案將以與 find 相同的方式包含子目錄,看起來太複雜了:
resetextglob=$(shopt -p extglob) # store value of extglob
resetnullglob=$(shopt -p nullglob) # store value of nullglob
shopt +s extglob nullglob
for i in $HOME/Shell/*.sh $HOME/Shell/**/*.sh
do
source "$i"
done
$resetextglob # reset extglob to original value
$resetnullglob # reset nullglob to original value