exec の引数について
1つだけなら、問題ない。
Kernel.exec("ls")
2つになると・・・
Kernel.exec("ls -lt ")
ただし、これはシェル経由の呼び出し。
3つになると・・・
Kernel.exec("ls -lt /")
これもシェル経由の呼び出し
シェル経由ってのは、sh に引数を与えて、呼び出している。
だから、実行中のプロセスを見ると sh が中間にいる。
シェル経由で呼び出しサンプル
Kernel.exec("sleep 10 ")
実行して、ps を見ると次のようになる。
0279 pts/0 Ss 0:00 \_ -bash #ruby を実行したbash 30512 pts/0 S+ 0:00 \_ sh -c sleep 10 ## ここがシェル経由 30514 pts/0 S+ 0:00 \_ sleep 10
これは、シェルに「文字列」を渡して起動している。つまり bash でコマンドを撃ち込んだのと同じ。
第二引数を指定して、シェル経由にならない呼び出し。
直接サブプロセスを起動する場合。
Kernel.exec("sleep","10")
こんどは、プロセスを見てみると sh がない。つまり直接サブプロセスを起動している。
30279 pts/0 Ss 0:00 \_ -bash 30643 pts/0 S+ 0:00 \_ sleep 10
第二引数〜第N引数を指定すると、直接起動される。
これは、システム・コールを使ってexecした状態になる。exec 族の システムコールの話は長いので割愛。
複数の引数をまとめて入れるには
splitするのが一番手っ取り早い。
exec " command arg arg arg arg ".split
ショートオプションもロングオプションもすべて区切って配列に。
exec( "ls", "-alt","color=auto" , "/"] )
じゃぁ、ショートオプションの場合は?
## cut -d ' ' -f 1 exec( "cut", "-d","' ' " , "-f", "1"] )
全てを空白区切りで渡す。
でも空白区切りが面倒だから。
split する
exec( * "ls -alt --color=auto / ".split)
あー楽チン
exec 使うケースは少ない。
今回は、孫プロセスを作りたくない!というシンプルな欲求に於いて調べたの。
signal trap で死なないので、ちょっといろいろ調べてた。
ネットに情報ないし、spawn しろってことなんだろうなあ
pipe はどうなるのか
配列で起動した時、pipe は渡せないので、Open3/4を使う必要があるだろうね