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プログラムなどを移植する際に、パスを気にする必要がなくなります。 問題が解決出来たので、今回はここまで