へっぽこ社会人4年生がプログラミングを頑張る

へっぽこ社会人4年目がプログラミング系統を中心に書きたいことをつらつらと書きます

FreeBSDのPerlやbashのパスについて

Mac OSXやLinuxなどでbashPerlスクリプトを記述する際に、 スクリプトファイルの先頭の行に #!/bin/bash や、#!/usr/bin/perl のように記述します。 これは、bash/bin/bashに、 Perl/usr/bin/perlに存在する環境であれば正常に動きます。

ところで、自分はMac OSXやUbuntu Linuxの他に、 FreeBSDに時々触れたりします。 そして、Perlbashもある程度触ります。 FreeBSDはデフォルトではbashPerlもインストールされていないので、 pkgを用いてインストールしました。 その後、MacUbuntuで書いたPerlスクリプトを移植した際に、ある問題にぶち当たりました。

動かない!!

分かってしまえば、動かないのは当たり前なのですが、 FreeBSDでのPerlbashのインストール先がMacLinuxとは異なるのです。 実際にどこにインストールされているかというと、 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プログラムなどを移植する際に、パスを気にする必要がなくなります。 問題が解決出来たので、今回はここまで