Files

循環目錄中的每個文件,但在沒有文件時不拋出錯誤

  • September 19, 2022

我想根據 .profiles/ 目錄中的文件載入別名。

for profile in ~/.profiles/*; do
   for file in ~/.s1n7ax/$(basename $profile)/alias/*; do
       include "$file"
   done
done

但是,當裡面沒有任何文件時,~/.s1n7ax/$(basename $profile)/alias/*它會引發錯誤。

/home/s1n7ax/.zshrc:117: no matches found: /home/s1n7ax/.s1n7ax/work/alias/*

我想優雅地處理這個問題,而不會向 sdt 輸出錯誤。

預設情況下,zshshell 會將不匹配的文件名通配模式視為致命的。如果您希望 glob 不匹配任何內容,那麼您可以使用 globbing 限定符使模式擴展為空而不是失敗:

for profile in ~/.profiles/*(.N); do
   for file in ~/.s1n7ax/$profile:t/alias/*(.N); do
       include $file
   done
done

N這裡,如果沒有匹配的文件名,括號中的尾隨將使模式完全消失,從而導致相應的循環被跳過。點是另一個僅選擇正常文件的限定符。您是否還想匹配隱藏的名稱,您應該添加D到限定符列表中。

N限定符對模式的影響與在 shell 中設置shellnullglob選項時的效果相同bash,並且D與 setting 具有相同的效果dotglobbash除了迭代匹配的名稱並使用測試對每個名稱進行測試之外,該點沒有任何等價性-f

:t末尾是“tail”的$profile縮寫,將為您提供變數中路徑名的基本名稱。

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