1

1

私はこれを理解していません:

スクリプト:WORKDIR/sh/script.sh

[ -e filename ]          \
&& echo filename         \
|| [ -e ../filename ]    \
&& echo ../filename      \
|| { echo 'ERROR: failed to find "filename"' 1>&2 ; exit -1; }

出力:

$ cd WORKDIR/sh
$ ./script.sh
../filename

$ cd WORKDIR
$ sh/script.sh
filename
../filename      # <---- WHY????

私の考え:

1

[ -e filename ]          \ -> false
&&                         -> skip this, it is already false
   echo filename         \ -> don't even try
|| [ -e ../filename ]    \ -> true
&& echo ../filename      \ -> true
||                         -> already true, skip the rest
   { echo 'ERROR: failed to find "filename"' 1>&2 ; exit -1; }

2

[ -e filename ]          \ -> true
&& echo filename         \ -> true
||                         -> already true, skip the rest
   [ -e ../filename ]    \
&& echo ../filename      \
|| { echo 'ERROR: failed to find "filename"' 1>&2 ; exit -1; }

バージョン:

bash --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)

ベストアンサー1

&&||優先順位が同じなので、次のようになります。

コマンドが入ったら、&&すぐに隣接する演算子でなくても、次のコマンドを見つけて実行します。あなたはする必要がありますいいえ単一のコマンド・リストでこれらの演算子を複数使用します。複数が必要な場合は、if / then構造を使用できます。

$ true && true || echo yes && echo no
no

これは次のように大きく異なります。

if true; then 
  true 
else 
  echo yes && echo no
fi

$ if true; then true; else echo yes && echo no; fi
$

または:

$ true && false || echo yes && echo no
yes
no
$ if true; then false; else echo yes && echo no; fi
$

私はあなたの構成を次のように書きます:

if [ -e filename ]; then
    echo filename
elif [ -e ../filename ]; then
    echo ../filename
else
    echo 'ERROR: failed to find "filename"' >&2
    exit -1
fi

おすすめ記事