Lから始まるLinux

3章27話
ジョブ管理
3章28話 execコマンド
もくじ
3章29話
ANSIエスケープシーケンス
exec コマンド
若木 しげる
今回はシェルのプロセスを 置き換える方法を学ぼう!
若木 みどり(驚き)
え? 意味がよくわからないんですけど?!
仕組み
若木 しげる
プロセスを置き換える 理由を理解するために まずはプロセスの 親子関係の話から入ろう
若木 みどり
プロセスは親子関係があって 親プロセスから子プロセスが 作られるんだよね?
若木 しげる
そうそう その話だよ!
若木 しげる
今動いているシェルを pstree の表示のように 表現してみよう
bash
若木 みどり
このシェル bash私のコマンド入力を処理してくているんだよね!
若木 しげる
そういうことになるねこのシェルからシェルスクリプトを実行したとしよう親子関係はこのようになるんだ
bash ─── bash
若木 みどり
うんこれは理解できるよ!親の bash私の入力を受け付けるシェルで子の bashシェルスクリプトを解釈するシェルというわけだね!
若木 しげる
ここで実行しているシェルスクリプトが以下のようなものだったとしよう
#!/bin/bash
ls -l "$@"
若木 みどり
ls-l オプションを付けてくれるスクリプトだね!
若木 しげる
このシェルスクリプトでls が実行されるとこのようになるのはわかるかな
bash ─── bash ─── ls
若木 みどり
そうなるよね
若木 みどり
でもこうやって見てみるとシェルスクリプトのシェル bash が余計に感じるなぁだって ls を呼び出しているだけでしょ?
若木 しげる
このように一つのコマンドを便利にしたりするスクリプトを「ラッパースクリプト(wrapper script)」と呼ぶよ
若木 みどり
メインとなるコマンドを「つつんで(wrap)」便利にしてあげているんだね
使い方
若木 しげる
このようなラッパースクリプトで使われるのが exec なんだ
exec [オプション]... [コマンド]
若木 しげる
これは exec を動かしたシェルのプロセスをコマンド のプロセスに置き換えてくれるよ
若木 しげる
さっきのスクリプトの例だとこんな感じになるよ
#!/bin/bash
exec ls -l "$@"
若木 みどり(驚き)
じゃあこのスクリプトを実行すると親子関係はこうなっちゃうんだ?!
bash ─── ls
若木 しげる
そのとおり!シェルスクリプトを動かしていたbash のプロセスがls のプロセスに置き換わるんだ
若木 みどり
bash プロセスがls に置き換わっちゃうんでしょ?exec より後に記述があったらどうなっちゃうのかな?
若木 しげる
ls のプロセスが処理を終えた時点で終了になるよだから exec 以降に記述があったとしてもそれらの記述は実行されないことになるんだ
若木 みどり
つまり execラッパースクリプトの最後で使うんだね!
まとめ
若木 みどり
今回はシェルのプロセスを置き換えるexec を学んだよ!ラッパースクリプトで使われるよ!
若木 しげる
exec とリダイレクトを組み合わせ3番以降のファイルディスクリプタを使う目的でも利用されるんだこれは高度な使い方なのでここでは説明はしないけど興味があれば「exec リダイレクト」などで検索してみよう!