シェルアウトされたコマンドがゼロ以外の終了コードで戻ったときにRubyスクリプトを失敗させるにはどうすればよいですか?

その-g

Rubyスクリプトでは、システムコマンド/コマンドラインを呼び出すさまざまな方法があります

  1. バックティック: `command arg1 arg2`
  2. 区切り形式、例%x(command arg1 arg2)(他の区切り文字が利用可能)
  3. Kernel#system 方法: system('command arg1 arg2')
  4. Kernel#exec 方法: exec('command arg1 arg2')

呼び出されたコマンドが(ゼロ以外の終了コードで)失敗したときにRubyスクリプトを(例外を除いて)失敗させたい場合$?は、最初の2つのバリアントの特殊変数終了コードを確認できます

`command arg1 arg2`
fail unless $? == 0

または

%x,command arg1 arg2,
fail unless $? == 0

コマンドの標準出力がRubyスクリプトの標準出力に送られることに問題がない場合(そして私はそうです)、バリアント3を使用して、その戻り値を確認できます。

unless system('command arg1 arg2')
  fail
end

例外をレスキューする機能や、レスキューされていない例外のスタックトレース印刷動作を気にしない場合は、もちろん、の代わりにexit(1)または最初の2つのバリアントexit($?)使用できfailます。

さらにコマンドの実行がRubyスクリプトが最後に行うべきことである場合、コマンドが成功した場合でも(終了コード0)、4番目のバリアントを使用できます。

exec('command arg1 arg2')

これにより、Rubyプロセスが、コマンドを呼び出して作成された新しいプロセスに置き換えられますが、Rubyスクリプトの呼び出し元への影響は同じです。呼び出されたコマンドによってゼロ以外の終了が発生した場合、ゼロ以外の終了コードが表示されます。コード。

私は4番目のバリアントの簡潔さが非常に好きですが、コマンドを実行することが成功した場合に最後に行うことではない場合、残念ながらそれを使用することはできません。他のバリアントの条件付きfailまたはexit呼び出しは、比較すると非常に不潔に見え、私の1つのユースケースでは、単一レベルの抽象化と単一責任の原則に違反することがほとんどです。

もちろん、最初の3つのアプローチのいずれかのラッパー関数を簡単に記述して、それらの使用法を簡潔に見せることはできますが、これはそのような基本的な方法のように見えるので、Rubyにはすでにそのようなものが組み込まれているのではないかと思いました...独自のラッパーの代わりに使用できるユーティリティ関数であろうと、コマンドが失敗したときに1つまたは複数のコマンド呼び出しメソッドの動作を変更してエラーまたはゼロ以外の終了を引き起こすメカニズムであろうと、と同様です。オプションをset -e

マックス

私の知る限り、これを行うための組み込みの方法はありませんが、少しのメタプログラミングの魔法であなたが望む振る舞いをほぼ得ることができます

def set_exit enable
  if enable
    define_method :system do |*args|
      Kernel.system *args
      exit $?.exitstatus unless $?.success?
    end
  else
    define_method :system, Kernel.instance_method(:system)
  end
end

set_exit true
# ...
# any failed system calls here will cause your script to exit
# ...
set_exit false
# now system is back to normal

これは、組み込みの動作が必要な場合に明示的に使用ながら、を再定義systemすることObject機能しKernel.systemます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ