"[ -f file ] && command" の代わりに "[ ! -f file ] || command" を使用する理由がありますか?

"[ -f file ] && command" の代わりに "[ ! -f file ] || command" を使用する理由がありますか?

私が見つけた

[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net

Ubuntu 16.04では/etc/default/lxc置き換えられているようです(私のコードまたはパッケージマネージャのコード)。

[ -f /etc/default/lxc-net ] && . /etc/default/lxc-net

テストは反直感的であるため(ファイルが存在しないためテストが失敗した場合はコマンドを実行します)、-versionと比較して利点があるかどうか疑問に思います&&

答え1

うん、気になるなら複合文の終了コード。以下を試してください。

#! /bin/sh -

! "$@" || true
echo "$?"

"$@" && true
echo "$?"

true次に、false引数を使用して実行します。

./script true
0
0

./script false
0
1

このためです段落評価ブール式。

OPの例では、ファイルが存在しません:

  • 最初の場合、最初の条件は2番目の操作(TRUE OR x = TRUE)を評価せずにTRUEを返します。複合文の結果はTRUEです。
  • 2番目のケースでは、最初の条件は2番目の操作(FALSE AND x = FALSE)を評価せずにFALSEを返します。複合文の結果はFALSEです。

終了コードは非常に重要です。確認するbashスクリプトのset -eはどういう意味ですか?set -etrapおよびの可能な意味を確認してくださいset -o pipefail

答え2

[ -f file ]file存在する場合はtrueそしてですplain file

[ ! -f file ]file存在しない場合は真または別のファイル形式です。

したがって、読みやすさ以外には実質的な違いはありません。

関連情報