如何讓 ~/.bashrc 使用循環執行 ~/Shell 目錄中的所有腳本?

如何讓 ~/.bashrc 使用循環執行 ~/Shell 目錄中的所有腳本?

我的目錄中有 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 zshetc)指令source雖然可讀,但不是通用的,也不存在於dash我所知道的最正確的 shell 中。就目前而言,相同的程式碼可用於將程式碼載入到幾乎任何 bourne-shell 衍生產品中。

直接源自 shell 的檔案的傳統命名約定是使用後綴rcor .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

相關內容