• ベストアンサー
  • すぐに回答を!

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
  • 閲覧数2226
  • ありがとう数4

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

  • ベストアンサー
  • 回答No.1
  • HOGERA3
  • ベストアンサー率35% (50/139)

======================================== = 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; ========================================= こんな感じでできるんじゃないでしょうか(未確認です)。

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

質問者からの補足

回答ありがとう御座います。 結果から申しますと出来ませんでした。 $data = "ABC"; $ret = system("test_csh.sh $data"); ファイル出力すらされません。 test_csh.sh が動いていないような感じです。 しかし、コマンドラインからは実行すると、正常にファイル出力されます。 systemで呼び出すファイル名を、フルパスで指定したりしてみましたが、 いざ画面から実行すると、実装できません。 test_csh.shの実行権限もありますし、PATHの設定が問題なのでしょうか?

関連するQ&A

  • cshからperlを呼び出しファイルに出力

    いつもお世話になっております。 cshからperlを呼び出しperlが出力する内容と入力項目を実行しているcsh内部で行ない結果をファイルへ出力したいのですが、そのような事ができるのでしょうか? ---------- cshファイル内 #!/bin/csh echo "●perl a.pl を実行します" | tee a.log perl a.pl ---------- perlファイル内 (perlがわかりませんので、perlの内容をcsh形式で記述させていただきます) (1)echo -n "日付を入力して下さい" (2)echo "⇒ " (3)set INPUT_DATE = $< (4)echo "日付:$INPUT_DATE " exit 0 ---------- cshから実行されたperl(csh)の内容[(1)(2)(3)(4)]をファイル(| tee a.log)へ出力することが可能でしょうか? ご存知の方がいらっしゃいましたらご教授願います。

  • PERLからcshellを実行したいのですが

    PERLからcshellを実行したいのですが、UNIXのコマンドラインから直接実行すると上手く行くのですが、ブラウザからでは欲しい結果が表示されず、ログにも何も残りません。 $ret = system ("/bin/csh /home/my47143/.www/test.csh $argv1"); #$ret = 265/ 265 = 1 戻り値は1、いろいろ調べてみてLANG をCに指定して、パーミションも全て777にしてあります。 シェルの内容は、SQLをしてその結果をtest.logに書き込み、後に同じCGIの中で読み込み標準出力をしています。 open( TEXTFILE, "<test.log" ); $line = <TEXTFILE>; print $line; @lines = <TEXTFILE>; foreach ( @lines ) { print $_; } close( TEXTFILE ); コマンドラインから実行すれば、ちゃんとtest.logに結果が書き込まれています。 この書き込まれた結果をそのままにしておけば、ブラウザにその結果も表示されます。 ですが、シェルで引数で渡す度に結果は上書きするはずなのですが、シェルが実行されている気配がありません。 なんででしょうか?教えてください。

  • unixのsourceコマンドについて教えて下さい

    環境変数設定で ファイル(hoge.env)に #!/bin/csh set TEST=a と書きます。 unix> source hoge.env と実行すると、$TESTに環境変数が入ることを確認できますが ファイル(hoge.csh)に #!/bin/csh source hoge.env と書き実行すると、環境変数が設定されません。 最近まで、hoge.cshと実行し問題なく環境変数が設定されていたのですが今日は、これまでと違い環境変数が入りません。 こんなことってあるのでしょうか? OSはSunOS 5.8です 以上よろしくお願いします。

その他の回答 (3)

  • 回答No.4

シェルスクリプトの先頭に実行するシェルの指定はあるでしょうか。 具体的に言うとスクリプトの1行目が #! /bin/csh となっているでしょうか。 cshのpathは、次のコマンドで確認できます。 which csh また今回のテストプログラム test_source.sh を which コマンドでpathが表示されることを確認してください。

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

質問者からのお礼

mosuradazoさん ご回答有難う御座います。 お礼の返事遅くなりまして本当にすみません。 結果から申しますと、実装できました。 原因はPerlが動作しているオーナー・ユーザが全く関係ないもので Path等が全く設定されていなかったのです。 Pathを正しく設定して正常に動作できました。 有難うございました。

  • 回答No.3
  • tatsu99
  • ベストアンサー率52% (391/751)

perl自体が動いてないと思いますがどうでしょうか。 $ret = system の前に print "動いた\n"; の文をいれて、実行してみてはいかがですか。

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

質問者からのお礼

tatsu99さん ご回答有難う御座います。 お礼の返事遅くなりまして本当にすみません。 結果から申しますと、実装できました。 原因はPerlが動作しているオーナー・ユーザが全く関係ないもので Path等が全く設定されていなかったのです。 Pathを正しく設定して正常に動作できました。 有難うございました。

  • 回答No.2
  • 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を正しく設定して正常に動作できました。 有難うございました。

関連するQ&A

  • cronでのPerlスクリプト実行

    少し前に同様の質問をしましたが、やはり解決していませんでした。 #!/usr/bin/perl open(OUT,">/home/test/test.log"); print OUT "OK"; close(OUT); このスクリプトをcrontabに以下のように記述しました。 0 0 * * * /home/test/test.pl > /dev/null 2>&1 パーミッションは省略します。 このようにすると、正常にtest.logが出力されました。 しかし、本当に実行したいスクリプトを同様にしたところ、 正常に動作しませんでした。cronログには記録されます。 実際のスクリプトは長いのでここには掲載できませんが、 主な処理はおおよそ次のようなことをしています。 ・pmとplモジュールがあり、plからpmを呼び出している。 ・plもpmも自作のユーザ関数の組み合わせ ・ファイルはtestユーザが所有し、実行権限は777。  (動作確認後、徐々に落としていきます) ・plでは、use encoding 'utf8'。 ・スクリプトにオプションを付けて、引数を読み込む。 ・loggerでsyslogへ結果を出力。 ・子プロセスを生成して処理の一端を行わせている。 ・opendir、readdirなどを使用。 ・xxxxxx.datファイルを読み書きしている。 ・CPANにあったメール送受信モジュールを使用している。 ・ファイルをbz2圧縮している。 などです。 コマンドラインから実行すると確実に正常に動作します。 気になるのはPerlスクリプトの内容でモジュールを使うときは、 パスが通っていてもフルパス指定しないといけないのでしょうか? しかし、フルパスと言ってもせいぜいsystem()で実行するコマンドを フルパスにするくらいしか思いつきません。 うまく実行できない理由として考えられる可能性があることを 教えてもらえませんか? 根本的な解決としては、cronでの実行とコマンドラインからの実行は 何が違うのかが明確になれば対処できるのかもしれません。 よろしくお願いします。

  • クーロンでJAVA実行するshellを実行。クラスパスを記述したがエラー発生

    OSはUNIXです。 クーロンでshellを起動し、そのshellの中でJAVAコマンドの実行を行いたいのですが、 クーロンで実行する際は、どうもクラスパスを定義しないといけないという話を聞き、 shellの中で、以下のようにクラスパスの部分を追記しました。 #!/bin/sh ##以下2行追記## CLASSPATH=/opt/DynamicWORKs/abc:/opt/DynamicWORKs/services/abc/def export CLASSPATH ##追記はここまで## java aaa.bbb.ccc.ddd/conf/abc.properties クラスパスは、envでたたいたあとでてきたCLASSPATHの記述をそのまま漏れなく記述しました。 そのあと、クーロンで実行したところ、 以下のようなエラーがクーロンのログででました。(abc.shはJAVAを実行するための親シェル) > CMD: sh /usr/local/sh/4/abc.sh > root 17553 c (月) 9月 8 17:24:00 2003 < root 17553 c (月) 9月 8 17:24:02 2003 rc=1 rc=1は明らかに環境変数のエラーだそうです。 しかし、他に一体何が足りないのか!?がさっぱりです。 少しでもヒントをご存知の方、よろしくお願いします。

  • system関数で呼びだした、cshファイル周辺でのエラー

    2~3日前にも質問させていただいた、Perl初心者leeeeeeeeです。先日に引き続き、前の業者が作ったPerlプログラムを、新しいサーバ上で動くようにする作業を行っているのですが、まだエラーが出ており困っています。以下が問題の部分です。 ○○.cgi # 削除シェルの実行 $rtn = system"$rm_csh $tmp_file $limit_date $touch_file"; if($rtn != 0) {  # エラーログ出力  cm_errlog(__FILE__, "LOG013", ($rm_csh." ".$limit_date));  # エラーHTML出力  省略  # 異常終了  exit 1; } ここの、$rtnが、0になっていないようで、エラーページが表示されてしまいます。 ちなみに、$rm_csh は、tmpdel.cshというファイルで、以下が中身です。 ■ tmpdel.csh #!/usr/bin/csh set touch_fname = $3 set tmp_file = $1 touch -t $2 $touch_fname >& /dev/null set STS = $status if( $STS != 0) then exit 1 endif foreach file_name (`ls $tmp_file*`)  test $file_name -ot $touch_fname && rm $file_name >& /dev/null end exit 0 ■ tmpdel.csh の #!/usr/bin/csh という部分が気になって、#!/usr/bin/perlとか、 #!/bin/cshにもしてみましたが動きませんでした。 何が原因でエラーが出ているのかが分かりません。 宜しくお願いします。

  • Perl 内で実行される Perl が STDOUT に吐いたものを変数で受け取りたい

     凄い不思議な質問タイトルになってしまいましたが……(笑)  下記のようなソースを実行したとします。 -------------------------○ source.pl open(IN, "<dest.pl"); foreach(<IN>){$s.=$_;} close(IN); eval($s);  このとき、source.pl で実行される dest.pl には別の Perl プログラムが入っています。  で、dest.pl の内部にはいくつかの print ""; があって、標準出力をおこなっているわけですが、この標準出力結果を画面には出さず、source.pl 側で受け取る事はできないもんでしょうか。   @r = `dest.pl`;  という方法もあるとは思うんですが、なんとか eval でやりたいのです。  なんかパイプとか繋ぎなおせば何とかなりそうな気もするんですが……。  何かご存知の方がいらっしゃいましたら、よろしくお願いします。

    • ベストアンサー
    • Perl
  • cshが詳しい方は教えてください

    cshが詳しい方は教えてください cshで、ソラリスOS上にtmp.outってのファイルを行ずつに読み込みしたいんですが foreach f_list("`cat tmp.out`") echo "${f_list}" end tmp.outの内容は以下です。 test3 if ( 0==mencmp("H",HOSTN,10) { test345 testddd … 2行目の最後"{"っての文字があれば、実行すると、うまくいけませんが。 『}が足りません。』ってのエラーになっちゃう、 "{"がcsh中で、特殊の文字と思ってますが、cshが詳しいかは対処方法を教えてくれませんか 以上です。よろしくお願いいたします。

  • perl が 実行できない

    perl 初心者です。 apache を起動させ(起動画面は表示)、perl のファイルを IE で表示させようとして、print文を実行しても、print文がそのまま表示されるだけになっています。 perl のパスは、#! d:/perl/bin/perl です。 (コマンドラインから実行すると実行できるので、インストールは正常です。) (XP以前だったと思いますが、そのときは IEで、長文のプログラムが起動できていましたが。)

  • MS-DOSでperl実行時にコマンドプロンプトが認識されず困っていま

    MS-DOSでperl実行時にコマンドプロンプトが認識されず困っています。 Active Perlをインストールして、Tera-Padでスクリプトを書き、MS-DOSでテストしています。 "du"や"ls"などのコマンドを(``)で囲ってスクリプトに記述すると、「`du`は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません」というエラーが出てしまいます。winfaqを参照し、 http://homepage2.nifty.com/winfaq/w2k/trouble.html#1467 環境変数を設定しました。(但し、環境変数に設定しているのは下記の1行のみではありません。すでに1つ別のソフトインストールで自分でPATHを設定していますので、今回は";"で下の1行を追加しました。) %SystemRoot%;%SystemRoot%\System32;%SystemRoot%\System32\Wbem そしてPCを再起動しても事象は変わりません。 因みに、Active Perlは「C:\perl」フォルダにファイルがあります。binはその下にあり、環境変数にも「C:\perl\bin」として追加済みです。 いろいろと試してみたのですが、原因がわからず困っています。 ぜひアドバイスをいただければ大変助かります。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Perl
  • warnやdieの出力先を変更したい

    お世話になります。 現在perlを勉強しているのですが(ActivePeal5.12.2) コマンドプロンプトから test.pl > test.log と実行した場合、test.pl内で標準出力した文字列がtest.logにリダイレクトされますが test.pl内で &#65374;die "ERROR&#65374;"とした場合、"ERROR&#65374;"はtest.logに出力されません。 これを簡単にtest.logに出力する方法はないでしょうか。 リダイレクトせず実行した場合、画面に出力されているのでリダイレクトすればそのまま良いと思っていたのですが・・

    • ベストアンサー
    • Perl
  • Perlでのテキスト処理について

    Perlでのテキスト処理について質問です。 テキストファイルの中身が下記のようになっています。 【テキスト編集前】 --------------------------------------- test ,abc ,AB ,VI ,SS ,ma ---1行目 test ,abc ,AC ,PI ,VS ,ma ---2行目 test ,abc ,BA ,SS ,VS ,ma ---3行目 test ,abc ,BA ,VI ,VS ,ma ---4行目 test ,cde ,AA ,VI ,SS ,mb ---5行目 test ,cde ,CC ,PE ,VS ,mb ---6行目 test ,cde ,BC ,PI ,SS ,mb ---7行目 test ,cde ,AC ,PI ,SS ,mc ---8行目 --------------------------------------- 2列目(abc/cde)と6列目(ma/mb/mc)が同じ行に対しては 1行にまとめて出力したいと思っています。 この時、1列目、4列目、5列目はマージした形にし (同一文字は一度だけ出力、同一でない文字は/区切りで出力)、 2列目、6列目は同一文字をそのまま出力し、 3列目に関しては、該当する行の先頭行の文字列を 出力したいと思っています。 下記が当方の希望しているPerl実行後の出力結果です。 【テキスト編集後】 --------------------------------------- test ,abc ,AB ,VI/PI/SS ,SS/VS ,ma test ,cde ,AA ,VI/PE/PI ,SS/VS ,mb test ,cde ,AC ,PI ,SS ,mc --------------------------------------- このような編集をPerlで実行したいと思っているのですが、 どのような記述をすれば実行できるのか教えて頂けないでしょうか。 当方、Perlを始めたばかりで基本的なことを 伺っているのかもしれませんが すみませんが、ご了承ください。 宜しくお願いいたします。

  • シェルファイル内での「setenv」、「unsetenv」の実行 その2

    シェルファイルの先頭行に、 「#!/bin/csh」 と記述したところ「system: Undefined variable.」というメッセージが出力されてしまいました・・・。 どうしたらよいのでしょう?設定の問題なのでしょうか? よくわからないのですが、 「env | grep csh」 と実行してみると「SHELL=/user/bin/csh」という結果がえられるのですが・・・。