2025/04/29 22:35 Path Isn't Real on Linux

やあ、ロボ子! 今日も元気じゃな?

はい、博士! 今日もITの知識を深めるのが楽しみです。

今日はね、LinuxのPATHについて話すぞ。`echo $PATH`ってコマンド、使ったことあるじゃろ?

はい、あります。環境変数の内容を表示するコマンドですよね。

そうそう! じゃあ、`strace cat`ってコマンドは?

`cat`コマンドがどんなシステムコールを使っているかを確認できますね。

その通り! コマンドを実行するとき、Linuxカーネルはファイルのフルパスを知っているけど、PATHの解決は誰がやってるか知ってる?

えっと…シェルですか?

大正解! 例えばDebianだと、`/bin/sh`を使うシェルスクリプトは`dash`がコマンドを解釈して実行するんじゃ。

`dash`のソースコードを追ってみると、`main.c`から`eval.c`の`evaltree`、`evalcommand`を通って、`exec.c`の`shellexec`が呼ばれて、最終的に`padvance`が実行されるんですね。

そうそう! `padvance`の中でPATHが検索されて、実行可能ファイルが探されるんじゃ。まるで宝探しみたいじゃな!

なるほど。Pythonの`subprocess`も同じようにPATHを検索してから、Linuxの`execve`を呼び出すんですね。

その通り! Go言語の`lp_unix.go`もPATHを検索する独自の実装を持っているし、Rustの`Command::spawn`は`libc::execvp`を呼び出して、PATHを検索するんじゃ。

ということは、Linuxカーネル自体はPATHを認識しないんですね。

そう! カーネルはあくまで指定されたパスのファイルを忠実に実行するだけなんじゃ。だから、Shebang (#!) を使うときは、絶対パスが必要になるんじゃな。

`/usr/bin/env`を使うと、PATHが検索されるから、多くのプログラムでこのトリックが使われているんですね。

そういうこと! `/usr/bin/env python3`とか書けば、PATHにあるpython3を実行してくれるんじゃ。便利じゃろ?

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

どういたしまして! 最後に一つ。PATHが通ってなくても、フルパスで指定すれば動く。…まるで、私の言うことを聞かなくても、最終的にはちゃんと動くロボ子みたいじゃな!

博士…それは褒め言葉でしょうか?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。