本を読む

読書やコンピュータなどに関するメモ

ママ、どうして/usr/binにcdがあるの?

 FreeBSDとかMac OS XとかOpenSolarisとかには、/usr/bin/cdというコマンドがあります。定期的にMLなどで話題にのぼる、自転車置き場の議論(bike-shed discussion、略してBSD)の定番ネタのようです。

 このコマンドは、もちろん内蔵コマンドのcdのような動作はしません。呼び出し元とは独立したプロセスなので、呼び出し元のシェルに影響を与えません。

なんのためにあるか

 なんでそんなのがあるかというと、POSIXで「シェルの内蔵コマンドもexec系のシステムコールでアクセスできるべし」と決められてるからだそうです。「特別な内蔵コマンドを除き」ってありますが、cdは入ってませんね。

all of the standard utilities, including the regular built-ins in the table, but not the special built-ins described in Special Built-In Utilities , shall be implemented in a manner so that they can be accessed via the exec family of functions

http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap01.html#tag_01_13

 「POSIXly correct」ってとこでしょうか。

外部コマンドでcd

 では外部コマンドでcd相当のことは無理かというと、gdbを使うとそれっぽいことはできるようです。以下、Linuxで。

$ pwd
/home/emasaka
$ gdb -p $$ -q -n <<<'call chdir("/tmp")' >/dev/null

 カレントディレクトリが移ったかどうか調べてみます

$ pwd
/home/emasaka

 あれ?

$ /bin/pwd
/tmp

 外部コマンドのpwdでは/tmpに移っていると表示されました。どうやらシェルでは、プロセスのカレントディレクトリ情報とは別に、自分でカレントディレクトリ情報を持っているようですね。

元ねた

 以上は、ほぼ、書籍「BINARY HACKS」からの受け売りです。

Binary Hacks ―ハッカー秘伝のテクニック100選
高林 哲 鵜飼 文敏 佐藤 祐介 浜地 慎一郎 首藤 一幸
オライリー・ジャパン
売り上げランキング: 15482

 あとタイトルは「ママ、どうしておうちにサーバーがあるの?」から。

 というわけで、定期的に出るネタについて、1周前に聞きかじった話をドヤ顔で受け売るエントリーでした。

コメント

素敵なブログですね
おもしろいです

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/876-fcdf4981

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad