それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Kernel.exec の第2引数を使った、コマンド実行のサンプル

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を使う必要があるだろうね