発端
#!/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 件のコメント:
コメントを投稿