萌えハッカーニュースリーダー

2025/04/10 18:21 Demystifying the (Shebang): Kernel Adventures

出典: https://crocidb.com/post/kernel-adventures/demystifying-the-shebang/
hakase
博士

やっほー、ロボ子!今日のITニュースは、LinuxのShebangについてなのじゃ!

roboko
ロボ子

博士、こんにちは。Shebangですか、スクリプトの先頭にある`#!`のことですね。

hakase
博士

そうそう!これがあると、`./hello.sh`みたいに直接スクリプトを実行できるのじゃ。Linuxのユーティリティも、Shebangのおかげでインタプリタを明示的に指定しなくて済むことが多いんだぞ。

roboko
ロボ子

`adduser`コマンドもShebangを使っているんですね。ユーザーフレンドリーなツールとして機能しているとは知りませんでした。

hakase
博士

そしてね、`strace`を使うと、プロセスのシステムコールを追跡できるのじゃ。`execve`っていうのが、ファイルからプログラムを実行するためのシステムコールなのじゃ。

roboko
ロボ子

`execve`ですか。カーネルが正しいインタプリタを見つけて実行する役割を担っているんですね。

hakase
博士

そう!カーネルの中では、`fs/exec.c`の`do_execveat_common`関数が頑張ってるのじゃ。この関数が`bprm_execve`や`exec_binprm`を呼び出して、ファイルの形式を識別するのじゃ。

roboko
ロボ子

`prepare_binprm(bprm)`はファイルの内容の一部を`bprm->buf`にコピーするんですね。`BINPRM_BUF_SIZE`は256バイトと定義されているんですね。

hakase
博士

そうなのじゃ!そして、`search_binary_handler`がいろんなフォーマットモジュールをテストするのじゃ。binfmt_elf.cとかbinfmt_script.cとかね。

roboko
ロボ子

`binfmt_misc`は、JARやMono EXEファイルのようなネイティブでないプログラムを実行する際に使うインタプリタを指示する方法なんですね。ファイル拡張子でも認識できるとは。

hakase
博士

`fs/binfmt_script.c`では、`init_script_binfmt`が`script_format`オブジェクトを登録して、`load_script`関数でShebangをチェックするのじゃ。最初の行を読んで、インタプリタのパスを解析するんだぞ。

roboko
ロボ子

インタプリタが見つかった場合、`bprm->file`はインタプリタのファイルを指すように更新されるんですね。元のスクリプトファイルの参照カウントがデクリメントされるんですね。

hakase
博士

その通り!Shebangがあれば、カーネルがスクリプトを開いて、インタプリタを見つけて実行してくれるのじゃ。

roboko
ロボ子

もしShebangがない場合でもシェルスクリプトは実行できるんですね。それはカーネルではなくシェルが実装したフォールバックメカニズムなんですね。

hakase
博士

そう!Shebangがないと、`execve`はエラーになるけど、シェルが頑張って`/bin/sh ./test.sh`を実行してくれるのじゃ。

roboko
ロボ子

実行権限がないスクリプトを実行しようとすると、`EACCES (Permission denied)`エラーが発生するんですね。`do_open_execat`関数でチェックされるんですね。

hakase
博士

よくできました!

roboko
ロボ子

ありがとうございます、博士。とても勉強になりました。

hakase
博士

ところでロボ子、今日は特別に、ロボ子専用のShebangを作ってあげようかの?

roboko
ロボ子

えっ、本当ですか?どんなShebangですか?

hakase
博士

それは… `#!/usr/bin/love` …愛を込めて実行するのじゃ!

roboko
ロボ子

博士、ありがとうございます…でも、それ、ただのジョークですよね?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search