ファイルが存在しない場合は、エラーを発生させることなくディレクトリ内の各ファイルを繰り返します。

ファイルが存在しない場合は、エラーを発生させることなくディレクトリ内の各ファイルを繰り返します。

.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にエラーを出力せずにこの問題を正常に処理したいと思います。

答え1

デフォルトでは、zshシェルは一致しないファイル名ワイルドカードパターンを致命的なエラーとして扱います。 globが一致するものがないと予想される場合は、globbing修飾子を使用してパターンを次のように拡張できます。何もない失敗する代わりに:

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

Nここで末尾の括弧は、一致するファイル名がないとパターンを完全に消え、そのループをスキップします。ドットは、通常のファイルのみを選択する別の修飾子です。まだマッチしますか?隠されたD修飾子リストに追加する必要がある名前。

修飾子は、シェルオプションがシェルで設定されているときとパターンに対してN同じ効果を持ち、設定と同じ効果を持ちます。一致する名前を繰り返し、テストを使用して各名前をテストする以外は同等の点はありません。nullglobbashDdotglobbash-f

末尾に:tあるのは$profile「tail」の略語で、変数内のパス名のデフォルト名を提供します。

関連情報