こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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 で動くようにしたいのですが、どのようにすればよいのでしょうか?

よろしくお願いいたします。

投稿日時 - 2010-01-12 11:22:44

QNo.5587128

困ってます

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

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

投稿日時 - 2010-01-12 18:22:23

お礼

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

お示しいただいた print プログラムを作ることで、解決できました。
どうもありがとうございました。

投稿日時 - 2010-01-13 09:38:19

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問