• ベストアンサー
  • 困ってます

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

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数4357
  • ありがとう数2

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • perlスクリプト内でシェルコマンドを実行するには??

    タイトル通りなのですが、perlスクリプト内でシェルコマンドを実行させる方法が分からなく、困っています。 実行したいシェルコマンドはUNIXのcrontab なのですが・・。 また、perlスクリプト内以外でシェルコマンドを実行する方法はあるのでしょうか?? どなたか分かる方いらっしゃいましたらご教授いただけると幸いです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • system関数でのシェル起動について

    system関数でシェルコマンドを発行しているC言語のプログラムがあります。 起動されるシェルコマンド(Cシェル)は2重起動防止のため以下の様にコマンド名をgrepしてPIDを取得し、2つ以上あると2重起動と見なしてコマンドを終了させています。 ps -aef | grep 自身のコマンド名 | grep -v grep ~ この時1回目の起動であるのに2重起動チェックに引っかかってしまいコマンドが実行されませんでした。 デバッグしたところ"csh コマンド名"のPIDとは別に一瞬"sh -c コマンド名"というプロセスがあってそれのPIDと合わせて2つに起動していると見なしていました。 調べたところsystem関数はsh経由(sh -c)でコマンドを実行するためだと言う事が分かり納得出来ました。 また元々バックグラウンドで起動させたいコマンドだったので以下の様に"&"を付与したところ2重起動チェックには引っかからなくなりました。 system("コマンド名 &") バックグラウンド起動させても2重起動チェックで弾かれれば納得出来るのですが、通常の起動と何が違うか分からずに釈然としません。 良く分かりませんが、通常起動だとオーバーヘッドで実行に時間がかかりチェックで弾かれるけど、バックグラウンドだと一瞬で起動されてたまたま上手く行った様に見えるだけだったりするなどなのでしょうか?? もしご存知の方がいらっしゃいましたらご教示頂けると幸いです。

  • PERLとシェルについて

    コマンドプロンプトで入力されたPERLコマンドはシェルのプログラムによってカーネルに引き渡されてカーネルがPERLのプログラムにそのコマンドを実行させて、その結果をカーネル→シェルへと引き渡されてコマンドプロンプトに表示されるのでしょうか?

  • system関数でCシェルコマンドを実行した時のエラー抑制

    CシェルコマンドをPerl上でsystem関数を使用し実行した時の、 エラーメッセージ抑制について教えてください。 ディレクトリ(DIR1をDIR2に)をコピーする際、 下記のようにしました。 system("cp -r DIR1 DIR2"); ここでもし、なんらかの原因でコピー失敗した場合、 「DIR1がありません。」などと、エラーメッセージが出力されます。 Cシェルでこの様なエラーメッセージを抑制するには cp -r DIR1 DIR2 >& /dev/null と、 することによって、エラーメッセージの抑制は可能になります。 これと、同じ事をPerlで行いたいと思っています。 ご回答よろしくお願いします

  • Perlで特定のコマンドを実行させるには?

    Perlでコマンドを実行させようと考えておりますが、 Windows版では $ret = ''; $ret = system 'echo', 'test ok!'; で正しく実行されましたが、 Linuxでは $ret = ''; $ret = system '/sbin/service', 'httpd stop'; で、認識できないコマンドとなりエラーになりました。 通常のコマンドラインでは /sbin/service httpd stopは動作します。 Linuxコマンドを実行させたいのですが、何かミスをしているのでしょうか?

    • ベストアンサー
    • Perl
  • Kシェルのリダイレクト

    Kシェルのリダイレクト シェル初心者で申し訳ございませんが、ご教授いただけたら幸いです。 やりたいこと  xxx.kshの実行ログを出力したい。 出力したいログは、以下コマンド実行時に標準出力されるログをファイルへ落としたい。 尚、実際の実行コマンドは、ksh -xは入力しません。 $ ksh -x ./xxx.ksh 上記コマンドを実行すると、詳細なログが表示されるのですが、ファイルへ落としたいと思います。 分かりづらいかも知れませんが、宜しくお願い致します。

  • perl system関数 引数 フォルダ

    perlのsystem関数を使って、コマンドを実行したいのですが、 実行ファイルの引数にフォルダを指定すると、うまく動作しません。 以下のように書いています system "実行ファイル フォルダ"; 実行ファイルは .BATファイルで、 指定しているフォルダには複数のテキストファイルが入っています。 perlで書いたcgiファイルは実行ファイルと同じディレクトリにあります。 コマンドからではなく、手動でドラッグ&ドロップすると正常に動作します。 windous7でperlはActivePerlを使用しています。 引数にはフォルダを指定できないのでしょうか? またフォルダを指定できない場合、解決策などはあるのでしょうか? よろしくおねがいいたします。

    • ベストアンサー
    • Perl
  • shはシェルなのかコマンドなのか?

    http://d.hatena.ne.jp/KishikawaKatsumi/20080504/1209922424 で $ sudo sh j2sdk-1_4_2_13-linux-i586-rpm.bin $ sudo rpm -ivh j2sdk-1_4_2_13-linux-i586.rpm と、shと打ち込むと最後の.binが消えますが、shは シェルなのか、それともコマンドなのかどちらなの でしょうか? 手元にあるlinuxの入門書には「shはシェルの一種である」 と記述があります。googleで検索をしてみましたが、 コマンドであるような記述もあり、混乱しております。 また、その入門書には「シェルを切り替えるには、コマンドライン でシェルの名前を入力します。exitコマンドで、元のシェル に戻ります」とあり、その文章の下には実際にshと打ち込んでexit で元に戻る様が書いてあるので実際に試してみました。 [root@localhost ~]# sh sh-3.2# exit exit [root@localhost ~]# この記述のせいでますますわからなくなりました。 なお、最後のbinがシェルスクリプトであることは理解して おります。 ご存じの方、ご教授頂ければ幸いです。何卒宜しくお願い申し 上げます。

  • Linuxのシェル(sh,bash等)について

    Linux上でコマンドを実行するとき、その窓口となるものが、シェル(sh,bash)という認識です。 つまり、 (1)CUI環境でLinuxを操作する上で、シェル以外でコマンドを実行する事はありうるのか? (2)Windowsのコマンドプロンプトも一種のシェルと言えるか 以上、2点についてお教え頂きたいです。 宜しくお願いします。

  • なぜLinuxでKornシェルが使えるのでしょうか?

    Linux初心者です。 シェルについてわからないことがあり、質問させていただきます。 Linux(Red Hatを使っています)の /bin/shと/bin/cshは、それぞれ/bin/bash、/bin/tcshのシンボリックリンクファイル、 なのに対して、なぜkshだけは/bin/kshそのままなのでしょうか? また、KornシェルはAT&T社が開発したものだそうですが、 これはLinuxで使う際にライセンスの問題に触れないのでしょうか? よろしくお願いいたします。