sudoとperlと環境変数
とあるPerlのスクリプトをsudoコマンドで実行しようとしたところ、エラーが発生。
そのスクリプトとは違うけど、こんな感じ。
$ sudo ./cookperl install perl-5.10.1
Password:
Can't locate LWP/UserAgent.pm in @INC (@INC contains: /Users/xxx/perl5/cookperl/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level /Users/xxx/perl5/cookperl/perls/perl-5.12.2/lib/site_perl/5.12.2 /Users/xxx/perl5/cookperl/perls/perl-5.12.2/lib/5.12.2/darwin-2level /Users/xxx/perl5/cookperl/perls/perl-5.12.2/lib/5.12.2 .) at ./cookperl line 20.
BEGIN failed--compilation aborted at ./cookperl line 20.
今まで予め用意されたコマンドしかsudoの対象にしていなかったので、全然知らなかったのだけど、sudoってセキュリティのためにPERLLIB、PERL5LIB、PERL5OPT、PERL5DBといった環境変数をクリアするそうです。
確かにsudo envとすると、設定されているはずの環境変数が表示されないですね。
自分の環境では環境変数としてPERL5LIBを設定していて、CPANからのモジュールは全てそこにインストールしているので、環境変数が見えなくなるとモジュールがロードできなくなるというわけでした。
sudoを前提にしたスクリプトを書く時は環境変数に気をつけないといけないようです。解決方法はいくつか有りますが、それはまた次回。

コメントする