条件付きで末尾のコマンドを実行する方法を探しています。私は&&を使用して複数のbashコマンドを一緒に接続します。 0より大きい実行。 0 いいえ。関連部分です。
mac RC=42 $ echo "abc abc" | wc -w && echo hi
2
hi
mac $ echo "" | wc -w && echo hi
0
hi
wc
戻り回数が0より大きい場合、&&部分を0として実行する代わりに実行する方法を探しています。
したがって、コマンド全体で動作することを思い出すことができます。
find '/Users/mac/exifin/' \( -iname "*.nef" -o -iname "*.dng" \) -type f \
-exec sh -c "ls -l \"{}\" && /usr/local/bin/exiftool -GPSLatitude -GPSLongitude \"{}\" |\
wc -w && echo copy && cp \"{}\" '/Users/mac/exifout/' && echo \" Delivered\" " \;
私はこれをMacOS 10.10.5端末で実行しています。
ベストアンサー1
他のコマンドと同様に、条件式をパイプできます。
$ echo | wc -w | [ $(cat) -gt 0 ] && echo hi
$ echo "abc abc" | wc -w | [ $(cat) -gt 0 ] && echo hi
hi
cat
内部$( ... )
コマンドの置き換えあたかもそこに書かれたかのようにコマンドラインにパイプ入力をしてからその値が0より大きいかどうかをテストします。。[ ... ]
もしそうなら、ブロック全体がtrueを返し、そうでなければfalseを返すので、通常&&
どおりに使用できます。
また、使用することができますtest
次の代わりに名前で[
:
$ echo "abc abc" | wc -w | test $(cat) -gt 0 && echo hi
cat
代わりにプロセスを避けることができますが、read;echo $REPLY
おそらく重要ではありません。
Bashでは、これはcat
正しい場所と時間で動作し、実行されます。パイプ内部しかし、他のいくつかのシェル(zshを含む)ではそうではありません。これが明示的に指定された動作かどうかはわかりませんが、sh
少なくとも3.2より前のBashバージョンでは、POSIXモードと非POSIXモード(macOSはPOSIXモードのBashです)の両方で安定しています。 POSIXの私の読書は、これが正しい結果であることと一致しています。