質問: perlからsystemコマンド呼ばれる時のシェルについて hp-ux/perl4 で作成したスクリプトを、linux(red hat)/perl5 へ移植するに当たって、system関数の動作が異なり困っています。 hp-ux では ksh をシェルとして使用していたため、perl からのsysytem関数で実行するsystemコマンドも、kshで動作するものを使っていました。linuxでもログインシェルをkshに設定しました。 ところが、hp-uxで使っていたprintコマンドが使用できず、以下のエラーメッセージが出ます。 sh: print: command not found シェルはkshを指定していても、perlからsystem関数やバッククウォート`` でシステムコマンドを実行するときは、shが使われるようなのです。 perl内の記述は以下のとおりです。 system("print 'a'"); "print"の前に"ksh "をつけたり、"print"を"echo"に変えると、正しく動作します。 移植するperlの本数が多いのと、print以外にもこの問題が起きるかもしれませんので、できれば perl 内からのシステムコマンド実行時にもログインシェルとおなじ ksh で動くようにしたいのですが、どのようにすればよいのでしょうか? よろしくお願いいたします。
回答: perl の system コマンドは、基本的に、プログラムを直接起動します。 リダイレクトなどシェルが必要な構文が使われている場合には、/bin/sh を通しますが、どちらにせよ、ログインシェルである ksh が呼び出されることはありません。 ( system("echo 'a'"); が動作するのは、/bin/sh の内部コマンドとは別に、/bin/echo がインストールされているからです) そのため、ksh の内部コマンドを system 経由で直接利用することはできません。 hp-ux環境では、外部コマンドとしてプログラム「print」がインストールされているのではないでしょうか。(もしくは、/bin/sh が ksh になっているとか) linux 環境でも、同様動作をする「print」プログラムをインストールすれば、perlスクリプトは改変しなくても動作させられるように出来ると思います。 おそらく#!/usr/local/bin/ksh print $*といった2行のシェルスクリプトでいけるんじゃないでしょうか。