実行ファイル名で動作が変わるCLIたち
同じ実行ファイルなのに動作が違うことに、慣れてなくてびっくりした。
上の記事を読みました。
systemdなGNU/Linuxにおいてshutdown
コマンド(/sbin/shutdown
)やhalt
コマンド(/sbin/halt
)などは、実はただのシンボリックリンクで、どれも/bin/systemctl
を実行しているようです。
同じバイナリなのに呼び出すコマンド名によって違う動作をするということです。
最初どうやって実現してるんだろうと不思議に思ってしまいましたが、よく考えればmain関数でargv[0]
を使って動作を変えればいいだけでした。やっていることは--version
みたいなオプションで動作が変わるのと同じですね。
TeX Liveでのバイナリたち
実はTeXで用いられるあれやこれやなコマンドたちもこのような機能をもってたりします。
pdfTeX
たとえば、TeX Live (2018)においてpdfetex
やpdflatex
などのコマンドは、pdftex
という名前の実行可能ファイルへのシンボリックリンクです。
$ cd /usr/local/texlive/2018/bin/x86_64-linux/ $ ls -l pdftex etex latex pdfetex pdflatex lrwxrwxrwx 1 root root 6 11月 26 2016 etex -> pdftex lrwxrwxrwx 1 root root 6 11月 26 2016 latex -> pdftex lrwxrwxrwx 1 root root 6 11月 26 2016 pdfetex -> pdftex lrwxrwxrwx 1 root root 6 11月 26 2016 pdflatex -> pdftex -rwxr-xr-x 1 root root 2175808 9月 20 2018 pdftex $
これらは同じ実行ファイルを実行しますが、もちろん動作は異なります。具体的には、別のfmtファイルが読み込まれます。(参考: Web2c: A TeX implementation; Determining the memory dump to use)
ここで注目なのはetex
やlatex
でさえ、pdftex
が使われているということですね。(参考: https://oku.edu.mie-u.ac.jp/texconf10/presentations/yato.pdf; 今どき、(TRIP テストの意味で)TeX なんて誰も使っていない!)
dvipdfmx
日本語LaTeXでよく使われる、dviファイルからpdfを生成するdvipdfmxも同じようなことになっています。
$ ls -l xdvipdfmx dvipdfm dvipdfmx ebb extractbb lrwxrwxrwx 1 root root 9 11月 26 2016 dvipdfm -> xdvipdfmx lrwxrwxrwx 1 root root 9 11月 26 2016 dvipdfmx -> xdvipdfmx lrwxrwxrwx 1 root root 9 11月 26 2016 ebb -> xdvipdfmx lrwxrwxrwx 1 root root 9 11月 26 2016 extractbb -> xdvipdfmx -rwxr-xr-x 1 root root 978840 9月 20 2018 xdvipdfmx $
dvipdfmxのソースはC言語なのでわかりやすいです。
argv[0]
から得られた文字列を比較(FILESTRCASEEQ
)して、動作が変わります。
おわり
TeX Live 2018では、dvipdfmxもシンボリックリンクになってるんですね。
おしまい💫
追記
同様の機能がある実行ファイルとしてBusyBoxというものを知りました。これは複数のコマンド(ls
やmv
など他多数)をひとつの小さな実行ファイルにまとめたものようです。
busybox ls
などでも呼び出せますが、/bin/ls
などと名前をつけたシンボリックリンクを置いておけば、BusyBoxによるものであることを意識することなくls
コマンドを使えます。