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

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

出典: https://blog.danielh.cc/blog/path
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

えっと…シェルですか?

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

博士…それは褒め言葉でしょうか?

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

Search