Thorを勉強していて気が付いたのだけど、コマンドに失敗した時にも終了ステータスが0(正常終了)になる。
$ loga lookup
loga lookup requires at least 1 argument: "loga lookup [TERM]".
$ echo $?
0
※ loga
コマンドを例に出しているのに他意はありません。たまたまこの時気が付いただけで。
これは気持ち悪い。
勿論、abort
とか exit 1
とか呼べば1で終了できるのだけど、コマンド作成ツールのThorがその辺対応してないとかあり得ないだろう、と思ってちょっと gem open
したりググったりした。
どうやら、Thor
のサブクラスのクラスメソッド exit_on_failure?
が true
を返せばいいみたい。Thor
自体はいつでも false
を返している。
lib/thor/base.rb
class Thor
# ...
module Base
# ...
module ClassMethods
# ...
def exit_on_failure?
false
end
なのでこれを変えてやればよい。
my-command
#!/usr/local/bin/ruby
require 'thor'
class MyCommand < Thor
class << self
def exit_on_failure?
true
end
end
desc 'subcommand ARG', 'My subcommand'
def subcommand(arg)
end
end
MyCommand.start
$ ./my-command subcommand
my-command subcommand requires at least 1 argument: "my-command subcommand ARG".
$ echo $?
1
ちゃんと失敗したのでこれで安心して寝られる。