コマンドを実行し、失敗した場合は別のコマンドを実行して 1 を返すにはどうすればよいでしょうか?

コマンドを実行し、失敗した場合は別のコマンドを実行して 1 を返すにはどうすればよいでしょうか?

私は他の言語ではこのスタイルに慣れています:

do_something || (log_error; return 1) # do something, and if that fails, log the error and then return 1 no matter what, even if the logging fails.

しかし、bash で同等のものが見つからないようです。問題は、括弧が独自のスコープを持つ関数のように動作し、 return 1 が期待どおりの動作をしないことです。

今のところはこんな感じですが、完璧ではありません。

! do_something && log_error && return 1

これの問題は、! がわかりにくく、1 が返されるかどうかはログ記録の成功に依存することです。

これはより良いですが、より冗長です:

do_something || (log_error; return 1) || return 1

何かご意見は?

答え1

中括弧を使用します。

 do_something || { log_error; return 1;}

答え2

最後に実行されたコマンドの終了ステータスは変数に保存されます$?。したがって、次のようなことができます。

do something
if [[ $? > 0 ]]; then 
   do log_error; exit 1; 
fi

&&読みやすさを考えると、私はそれが気に入っています。しかし、あなたのコードはまったく問題ありません。次のように置き換えるだけです;:

! do_something && log_error ; return 1

&&は「前のコマンドが正常に終了した場合にのみ次のコマンドを実行する」という意味で、;just は「次のコマンドを実行する」という意味です。

関連情報