- ベストアンサー
Perl から csh 実行
やまとです。 いつもありがとうございます。 Perl + csh を同時(?)に実行する方法を教えてください。 OSはSunです。 具体的にどのような処理を行いたいか簡単に説明しますと。 1.Perlでcshを実行(system関数?)し、cshで環境変数をセット(source)する。 2.cshで環境変数をセットしたら、ファイルを出力する処理が行われます。 3.Perlでcshによって出力されたファイルの内容を画面に表示します。 以下ソースを掲載します。(抜粋して) ================================================== = Perl ( test_perl.pl ) $data = "ABC"; $ret = system(`test_csh.sh $data`); ・ ・ ファイル(test.log)を開き、読込、画面に表示します(まだ作成してません。) ================================================== = Csh ( test_csh.sh ) source test_source.sh echo $1 > test.log ================================================== = test_source.sh setenv CLASSPATH .:/aaa・・・・・・ ↑ PATHの設定を行ってます。 ================================================== 画面に、「ABC」と出力させたいのです。 Perlからcshが実行されていないように思えるのですが、 Perlのsystem関数の使い方が誤っているのでしょうか? それとも、ClassPath等の設定をしなければならないのでしょうか? ちなみにコマンドから、 # test_csh.sh ABC と実行しますと、ファイルが出力され、かつ、sourceも実行されています。 Perlから実行する方法を教えてください。 説明が不十分であれば、補足いたしますのでご指摘ください。 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
======================================== = Perl ( test_perl.pl ) $data = "ABC"; system("test_csh.sh $data"); # $ret = system(`test_csh.sh $data`); # だと、バッククオート` を使っているから # test_csh.sh $dataを実行したときの出力結果が # system関数の引数として使われます。 # ですから、ダブルクオート" を使いましょう。 # 以下、test.logの内容を出力 open TESTLOG, "test.log" or die "test.log: $!\n"; print <TESTLOG>; close TESTLOG; ========================================= こんな感じでできるんじゃないでしょうか(未確認です)。
その他の回答 (3)
- mosuradazo
- ベストアンサー率60% (6/10)
シェルスクリプトの先頭に実行するシェルの指定はあるでしょうか。 具体的に言うとスクリプトの1行目が #! /bin/csh となっているでしょうか。 cshのpathは、次のコマンドで確認できます。 which csh また今回のテストプログラム test_source.sh を which コマンドでpathが表示されることを確認してください。
お礼
mosuradazoさん ご回答有難う御座います。 お礼の返事遅くなりまして本当にすみません。 結果から申しますと、実装できました。 原因はPerlが動作しているオーナー・ユーザが全く関係ないもので Path等が全く設定されていなかったのです。 Pathを正しく設定して正常に動作できました。 有難うございました。
- tatsu99
- ベストアンサー率52% (391/751)
perl自体が動いてないと思いますがどうでしょうか。 $ret = system の前に print "動いた\n"; の文をいれて、実行してみてはいかがですか。
お礼
tatsu99さん ご回答有難う御座います。 お礼の返事遅くなりまして本当にすみません。 結果から申しますと、実装できました。 原因はPerlが動作しているオーナー・ユーザが全く関係ないもので Path等が全く設定されていなかったのです。 Pathを正しく設定して正常に動作できました。 有難うございました。
- HOGERA3
- ベストアンサー率35% (50/139)
できなかったんですか。 以下のスクリプトを試したところ、 ファイル作成・ファイルの内容出力ともに できましたが。 ========== (test_perl.pl) $data = "ABC"; $ret = system("./test_csh.sh $data"); open TESTLOG, "test.log" or die "test.log: $!\n"; print <TESTLOG>; close TESTLOG; ========== ========== (test_csh.sh) echo $1 > test.log ========== >systemで呼び出すファイル名を、フルパスで指定したりしてみましたが、 >いざ画面から実行すると、実装できません。 >test_csh.shの実行権限もありますし、PATHの設定が問題なのでしょうか? いや、フルパスを指定してもだめってことは PATHの問題ではないでしょう。 何が問題なのかはスクリプトを見てみないとわかりません。
お礼
HOGERA3さん ご回答有難う御座います。 お礼の返事遅くなりまして本当にすみません。 結果から申しますと、実装できました。 原因はPerlが動作しているオーナー・ユーザが全く関係ないもので Path等が全く設定されていなかったのです。 Pathを正しく設定して正常に動作できました。 有難うございました。
補足
回答ありがとう御座います。 結果から申しますと出来ませんでした。 $data = "ABC"; $ret = system("test_csh.sh $data"); ファイル出力すらされません。 test_csh.sh が動いていないような感じです。 しかし、コマンドラインからは実行すると、正常にファイル出力されます。 systemで呼び出すファイル名を、フルパスで指定したりしてみましたが、 いざ画面から実行すると、実装できません。 test_csh.shの実行権限もありますし、PATHの設定が問題なのでしょうか?