最近、以下のようなbashスクリプトを見かけました。
[処理1] || true && [処理2] || true && [処理3]
bashにおける'||'、'true'、'&&'の役割は以下の通り。
||: OR演算子。 a || b 「a または bが真ならば真」。bashにおいては「aが失敗した場合bを実行する」という意味合いで使われることが多い。
&&: AND演算子。前の処理が成功したら次の処理を実行する。
true: 真を返す。trueコマンドを実行すると必ず終了ステータスが0となる。(つまり処理が正常に終了したとみなされる)
以上を踏まえた上で、もう一度上記のスクリプトを見てみると、
1. 処理1を実行する。成功すれば良し、失敗してもOR演算によってtrueコマンドが実行されるので、どのみち処理1は成功したと判断される。
2. 処理1は成功したと判断されたので、AND演算によって処理2が実行される。
3. 処理2が成功すれば良し、失敗してもOR演算によってtrueコマンドが実行されるので、どのみち処理2は成功したと判断される
4. 処理2は成功したと判断されたので、AND演算によって処理3が実行される。
以下のようなスクリプトを書いて検証してみました。
#!/bin/bash ## The script to understand how '||', '&&' and 'true' works cat /tmp/hoge.txt 2>/dev/null || true && echo 'hogeeee' >> /tmp/hoge.txt || true && echo 'foooooo'
上記のスクリプトの働きは以下の通り。
1. /tmp/hoge.txtというファイルを開く。ファイルが存在しなくてもOR演算によってtrueコマンドが実行され、処理は成功したと判断されるので、AND演算によって次の処理に進む。
2. 'hogeeee'という文字列を/tmp/hoge.txtに書き込む。書き込みが失敗してもOR演算によってtrueコマンドが実行され、処理は成功したと判断されるので、AND演算によって次の処理に進む。
3. 'foooooo'という文字列を標準出力に出力する。
スクリプト実行前は/tmp/hoge.txtは存在しません。
スクリプト実行後、/tmp/hoge.txtが作成されました。
どういうときに使えるか
複数の処理が存在するときに、途中の処理の成功・失敗に関わらず、一番最後まで処理を進めたいときに有用。
以上