Mac OSXやLinuxなどでbashやPerlのスクリプトを記述する際に、 スクリプトファイルの先頭の行に #!/bin/bash や、#!/usr/bin/perl のように記述します。 これは、bashが/bin/bashに、 Perlが/usr/bin/perlに存在する環境であれば正常に動きます。
ところで、自分はMac OSXやUbuntu Linuxの他に、 FreeBSDに時々触れたりします。 そして、Perlやbashもある程度触ります。 FreeBSDはデフォルトではbashもPerlもインストールされていないので、 pkgを用いてインストールしました。 その後、MacやUbuntuで書いたPerlスクリプトを移植した際に、ある問題にぶち当たりました。
分かってしまえば、動かないのは当たり前なのですが、 FreeBSDでのPerlやbashのインストール先がMacやLinuxとは異なるのです。 実際にどこにインストールされているかというと、 Perlは/usr/local/bin/perlに、 bashは/usr/local/bin/bashにインストールされていました。 なので、スクリプトの先頭のパスを書き換える必要があります。 つまり、Perlであれば、 #!/usr/bin/perlを#!/usr/local/bin/perlに、 bashの場合であれば、 #!/bin/bashを#!/usr/local/bin/bashに書き直すことで正常に動作します。
さて、スクリプトのパスを直せば正しく動作するのですが、 正直なところ、その都度修正するのが面倒です。 わざわざスクリプトを修正せずとも、スクリプトを正常に動作出来れば幸せですよね。 では、どのように実現するか。
例えば、Perlの場合、/usr/bin/perlから/usr/local/bin/perlを参照させることで解決します。 シンボリックリンクを作成するためには、lnコマンドを利用します。 実行例は以下の通りです。
# type perl
perl is /usr/local/bin/perl
# ln -s /usr/local/bin/perl /usr/bin/perl
# type perl
perl is /usr/bin/perl
# file /usr/bin/perl
/usr/bin/perl: symbolic link to /usr/local/bin/perl
#
lnコマンドはリンクを張るコマンドで、 -sオプションは、シンボリックリンクを張るように指定します。 パーミッションの問題があるので、root権限で実行した方が良いと思われます。 cpコマンドで実行ファイルをコピーする方法も考えられますが、プログラムの更新をした場合に、更新内容が反映されません。 実際に、自分のUbuntu 12.04 LTSでは、/usr/bin/ccを実行した場合、シンボリックリンクをたどり、/usr/bin/gccが呼び出されています。
一度シンボリックリンクを張ってしまえば、後は他のUNIX系OSで記述したPerlプログラムなどを移植する際に、パスを気にする必要がなくなります。 問題が解決出来たので、今回はここまで