• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlからsystemコマンド呼ばれる時のシェルについて)

perlからsystemコマンド呼ばれる時のシェルについて

このQ&Aのポイント
  • HP-UX/perl4のスクリプトをLinux(Red Hat)/perl5に移植する際、system関数でのシステムコマンド実行に問題が発生しています。
  • HP-UXではkshをシェルとして使用し、kshで動作するsystemコマンドを使用していましたが、Linuxではshが使われているため、エラーメッセージが表示されます。
  • ログインシェルをkshに設定しても、perlからsystem関数やバッククォートでシステムコマンドを実行するときにはshが使われるため、問題が発生します。移植先のperl内でシステムコマンドがkshで動くようにする方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

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行のシェルスクリプトでいけるんじゃないでしょうか。

k_mu_2001
質問者

お礼

分かりやすいご回答、ありがとうございます。 HP-UX で、(/usr/bin/sh print "a")とすると動きましたが、 Linuxでは動きませんでした。 printはパスが通っているところにありませんでしたので、 HP-UXでも外部コマンドとしてインストールされているのではないようでして、おっしゃられるように、/bin/sh が ksh になっているといった理由のようです。 お示しいただいた print プログラムを作ることで、解決できました。 どうもありがとうございました。

関連するQ&A