2011/03/23

bashのexceとはなんぞや

発端

    #!/bin/bash
    exec 2>&1
    somecommand

というコードがあって、exec 2>&1が何をしているかはわかるけど、内部はどうなっているのか知らなかった

execってsystem callにあるよね

exec(2)は既存のプロセスのまま新しくコマンドを実行する

例えば

    $ exec ls

上記コマンドは既存のshellのプロセスのままlsを実行して終了する。実行中だったshellはexecされたら、lsになってしまうのでshellも結果として閉じる。

    $ ls

だとfork(2)して子プロセスでexec lsしているので、shellは終了しない

bashのexecはなんだよ

よくわからないからbashのsourceを読んでみる。Open Sourceに感謝する瞬間である。

Bash公式からダウンロード。tar ballを展開して、中身を改める。

ざっくり中身を見るとbuiltins/exec.defが怪しいので中をあらためる。そうするとshell_execveが見つかる。これを追いかけると以下のようになる。

builtins/exec.def
↓
shell_execve関数発見
↓
execute_cmd.cにあり
↓
int shell_execve (command, args, env)が見つかる
↓
execve (command, args, env);
↓
こいつはunistd.hで定義されているexecve(2)のようだ

眠いので限界です

次回へ続く?

0 件のコメント:

コメントを投稿