答え
ここにあります*1。
3つの方法のそれぞれの具体例
1. run_command
メソッドを用いて引数にコマンドを書く
こんな感じです。
run_command('touch hello_itamae.txt')
戻り値に対して#stdout
や#exit_status
というメソッドを使うこともできます。
2. define
メソッドを用いてメソッドとして定義する
コマンド実行メソッドそれ自体を、別途メソッドとして定義します。定義されるコマンド実行メソッドは複数あっても構いません。以下のようにdefine
で定義します。this_method_contains_run_commands
という命名でメソッドを定義しています。
define :this_method_contains_run_commands do run_command('touch good_morning.txt') run_command('touch good_evening.txt') end
定義したメソッドを実行する際は引数が必須のようです(らしい。Chef-like ということだが、私は Chef を触ったことがないので分からない……)。具体的なドキュメントは以下にあります。
上で定義したthis_method_contains_run_commands
というメソッドを実行してみましょう。引数は適当なものでいいので*2、ここではnil
としました。
run_command_in_definition nil
以上で、touch good_morning.txt
とtouch good_evening.txt
が生成されたはずです。
3. execute
メソッドを用いてコマンドを実行する
execute
の引数にコマンドを与えればそれが実行されます。ここまでですとrun_command
メソッドと同じです*3。
run_command
メソッドと異なるのは、execute
メソッドはブロックを受け取ることができるという点です。このブロック内部にコマンド(など)を記述すると、最初の引数の実行コマンドに続けて、ブロック内部のコマンドを実行してくれます。
「2. define
メソッドを用いてメソッドとして定義する」の内容と同じことをexecute
メソッドを用いて実行する例を考えます。コードは以下のようになります。
execute 'touch good_morning.txt' do run_command('touch good_evening.txt') end
run_command
メソッドをダラダラと連ねたくない場合に有効です(なんだと思います)。
注意
私は見習いの板前です。