POSIXシェルで.
は、は特別なビルトインであるため、失敗するとシェルが終了します(などの一部のシェルではbash
、POSIXモードの場合のみ実行されます)。
エラーと見なされるものは、シェルによって異なります。ファイルの解析時に構文エラーですべてが終了するわけではありませんが、ソースファイルが見つからない場合や開くことができない場合はほとんどが終了します。ソース化されたファイルの最後のコマンドがゼロ以外の終了ステータスで返された場合に終了するものは知りません(errexit
もちろんオプションがオンでない限り)。
ここでやっています:
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
ファイルが存在する場合はファイルをソースし、存在しない場合はソースにしたくない(または、ここで空になっている-s
)場合です。
つまり、ファイルが存在しない場合、エラー(POSIXシェルでは致命的なエラー)と見なされるべきではなく、そのファイルはオプションファイルと見なされます。
ファイルが読み取り可能でない場合、またはディレクトリである場合(または一部のシェルで)構文解析中に構文エラーが発生した場合、それは(致命的な)エラーになります。
競合状態があると主張する人もいます。しかし、それは意味唯一のことは、ファイルが間に削除された場合、シェルはエラーで終了することをだろう[
と.
、私はそれはスクリプトがある一方で、この固定パスファイルが消えて突然であろうとそれにエラーを考慮することが有効だと主張したいですランニング。
一方、
command . "$NVM_DIR/nvm.sh" 2> /dev/null
どこcommand
¹が削除特別に属性を.
通り動作しないでしょう(それはエラー時にシェルを終了しないように)コマンドを実行します。
.
のエラーを隠しますが、ソースファイルで実行されるコマンドのエラーも隠します。
- また、ファイルのアクセス権が間違っているなどの実際のエラー状態も隠されます。
その他の一般的な構文(たとえばgrep -r /etc/default /etc/init*
、systemd
まだ変換されていない(EnvironmentFile=-/etc/default/service
代わりにオプションの環境ファイルを指定するために使用される)initスクリプトについては、Debianシステムで参照してください):
[ -e "$file" ] && . "$file"
そこにあるファイルを確認し、空の場合はソースを取得します。開くことができない場合は、致命的なエラーが発生します(そこにある、またはあったとしても)。[ -f "$file" ]
(存在し、通常のファイルである)、[ -r "$file" ]
(読み取り可能)、またはそれらの組み合わせのようなより多くのバリアントが表示される場合があります。
[ ! -e "$file" ] || . "$file"
少し改善されたバージョン。存在しないファイルがOKケースであることを明確にします。これ$?
は、最後に実行されたコマンドの終了ステータスを反映することも意味します$file
(前のケースでは、を取得した場合、それが存在しなかったのか、そのコマンドが失敗したの1
かわかりません$file
)。
command . "$file"
ファイルがそこにあることを期待しますが、解釈できない場合は終了しないでください。
[ ! -e "$file" ] || command . "$file"
上記の組み合わせ:ファイルが存在しなくても問題ありません。POSIXシェルの場合、ファイルのオープン(または解析)の失敗は報告されますが、致命的ではありません(より望ましい場合があります~/.profile
)。
¹注:zsh
ただし、エミュレーションのcommand
場合を除き、そのようなものは使用できませんsh
。Kornシェルでは、そのノートsource
実際の別名であるcommand .
、の非特殊なバリアント.