Closed thinca closed 1 month ago
私よくわからないのでどなたかレビューできる方お願いしますー
あれ? || true
では?
あれ?たしかに。 && true
だと意味なさそうですね
今回の場合はどちらでも大丈夫ですね。
背景について詳しく説明します。
このスクリプトは ${GITHUB_OUTPUT}
ファイルに対して以下のフォーマットで書き込みをして、次の step でエラーメッセージを表示します。
ERROR_MESSAGE<<MESSAGE
エラーメッセージ
この部分のメッセージが次のステップで `ERROR_MESSAGE` の名前で参照できる
MESSAGE
ここで、run
で実行されるスクリプトは shell
が未指定の場合は -e
付きで実行されるため、中央のコマンド実行がエラーで終了するとスクリプト全体が終了してしまい、最後の MESSAGE
が出力されないため ${GITHUB_OUTPUT}
ファイルがフォーマットエラーになって後続の処理も失敗してしまいます。
そこで中央のコマンドが失敗しないようにしたいわけなんですが、Bash の -e
については以下の仕様があります。
ただし、失敗したコマンドが、キーワード while または until の直後のコマンドの一部である場合、予約語 if または elif に続く条件式の一部である場合、 && または || によるコマンドのリストの一部である場合 (最後の && や || の後のコマンドを除く)、 パイプラインの中の最後のコマンド以外である、 コマンドの返り値が ! で反転されている場合、のいずれかであれば、シェルは終了しません。
つまり && true
で最後のコマンドを成功にすればシェルが終了することはありません。
今回のケースにおいては || true
でも結果はまったく同じなのですが、「シェルは終了したくないけど失敗したかどうかどうかで処理を分けたい」というケースにおいては &&
を使っておくと $?
にちゃんとエラーが残っている、みたいな使い方ができたりします(||
を使うと $?
も 0
になってしまう)。||
は握り潰す感じが強く出てしまうので私は割と &&
を使いがちです。
なるほど 👍
たぶん問題なさそう、かつ Approve ももらっているのでひとまずマージしちゃいます。懸念があったら再度教えてもらえると!
If the command fails, a step fails immediately. In this case,
MESSAGE
does not output. As a result, the job fails due to malformed output file. To prevent this, change the command so that it always succeeds.