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

このQ&Aのポイント
  • cshからperlを呼び出し、perlが出力する内容と入力項目をcsh内部で実行し、結果をファイルに出力する方法について教えてください。
  • cshファイル内で、perl a.pl を実行し、その結果をファイルに出力することは可能でしょうか?具体的には、cshから呼び出されたperlの内容をファイルに出力したいです。
  • cshから実行されたperlの内容をファイルに出力する方法について教えてください。
回答を見る
  • ベストアンサー

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)へ出力することが可能でしょうか? ご存知の方がいらっしゃいましたらご教授願います。

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

  • ベストアンサー
  • hchonan
  • ベストアンサー率79% (19/24)
回答No.1

プログラムの出力やエラー表示、キーボードからの入力などといった端末に表示されたものすべてを記録したい場合にはscriptコマンドが便利です。 提示されたcshスクリプトから、teeの部分を取り除いた ---------- #!/bin/csh echo "●perl a.pl を実行します" perl a.pl ---------- という内容の job.csh を作成した場合、下記のようにjob.cshを実行する前にscriptコマンドを実行することにより、端末に表示された文字を記録することができます。 ---------- % script a.log script コマンド開始。ファイルは a.log です。 $ csh ./job.csh ●perl a.pl を実行します ... ... $ exit script コマンド終了。ファイルは a.log です。 ---------- しかしながら、scriptコマンド自体もシェルスクリプトの中で実行させようとした場合、Solarisのscriptコマンドが実行するコマンドを指定できない仕様となっているため工夫が必要で、先のjob.cshを ---------- #! /bin/csh if ( "$SHELL" != "$0" ) then     setenv SHELL $0     exec script a.log else     echo "●perl a.pl を実行します"     perl a.pl     ....     .... endif ---------- とトリッキーな書き方をするか、もしくは参考URLのラッパスクリプトを利用する必要があります。( FreeBSD 4.x や util-linux 2.12 以降の script コマンドでは -c オプションが使えるのでこの工夫は必要ありません ) また、記録されたファイルには制御文字も記録されるので、 ---------- % cat a.log | col -b > b.log ---------- として制御文字を取り除く必要もあるかと思います。 script , col の両コマンドや参考URLのスクリプトを参考に工夫してみてください。

参考URL:
http://www.kmc.gr.jp/~tak/sources/sh/
basket11
質問者

お礼

早速のご回答ありがとうございます。 script に関して試してみたいと思います。 全てかa.logへ出力できそうな感じがしています。 実際に試す事が出来るのが2~3日後になってしまいますので、結果はそれから連絡差し上げます。 簡単ですが、お礼とさせていただきます。

basket11
質問者

補足

お礼が大変遅くなりまして申し訳ございません。 hchonan様よりご教授いただいた内容で万事上手くいきました。 大変勉強になりました。 本当にありがとうございます。

関連するQ&A

  • 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から実行する方法を教えてください。 説明が不十分であれば、補足いたしますのでご指摘ください。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • Linux上でtcpdumpの出力をperlで処理したいと考えています

    Linux上でtcpdumpの出力をperlで処理したいと考えています。 下記のようにtcpdumpの標準出力をperlの標準入力で受け取ろうとしても tcpdumpの処理が終わらないためパイプ(|)経由でperlにデータが渡ってきません。 [test.pl] $|=1; foreach(<>){ print "--- $_"; } exit; Linux上のコマンド tcpdump -l | ./test.pl これをteeに置き換えるとtcpdumpの出力はリアルタイムに表示されます。 tcpdump -l | tee a.log 質問:perlでteeを作ることはできますか?

    • ベストアンサー
    • Perl
  • 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中で teeを使っても戻り値を得たい

    例えば make compile |& tee log とすると、tee のせいでmake の戻り値が得られないということに関しての相談です。 いま、perlの中で、 > $cmd = "$make compile 2>&1| tee compile.log"; > $rval = system($cmd); > if($rval){ print "Error\n"} のような使い方をしています(実際は$rval >>8 とする必要があるようです)。 上記のようにログを端末に表示し、ファイルにも落とし、かつ戻り値も利用したい、という場合、どのようにしたらよいのでしょうか。 # BASHでは echo ${PIPESTATUS[0]} で得られる、 # Perl のTee Moduleがあるなどの情報だけは発見できたのですが。。。 宜しくお願い致します。

  • バッチファイルの日付計算が出来ません

    毎月1回実行するバッチファイルがあります。 このバッチファイルは、あるプログラムのログを退避するバッチファイルなので 月に2度以上実行させないようなチェックを入れたいと考えています。 たとえば、 最初に実行する時は、バッチファイルの中で日付を持たせたファイルを出力しておき 2度目の実行時は、日付のファイルを読み込んで1ヶ月以上たっていなければエラーとする ・・・といった事をやりたいのですが、やり方がわかりません。 日付ファイルの出力は、 echo %DATE:/=% >D:\datecheck.log とすれば良いことはわかるのですが、 日付を比較する方法はどうすれば良いでしょうか。 単純にset /Aで引き算をしてしまうと 20100207-20100131=76となってしまいます。。 どうか皆さん、よろしくお願いします(;o;)

  • 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が詳しいかは対処方法を教えてくれませんか 以上です。よろしくお願いいたします。

  • shとperlのデータ連携&perl出力

    初めて記載します。宜しくします。 perlでプログラムするのが初めてでなので、大分間違ってるかもしれません。 ※UNIX環境でシェルで日付差分(yyyymmddhhmmss)を求めたいのですが、「date -d」コマンドは使用出来ません。 シェルを実行しコマンドラインにて入力された【引数1】:実行区分(1 or 2)【引数2】:日付(yyyymmddhhmmss)、【引数3】:日付(yyyymmddhhmmss)と区分をperlに引数として渡して、perlでは"引数3-引数2"をして日数を算出しファイルに出力させたいです。 perl名:MCPFZAR_Compl.pl 実行コマンド例: perl MCPFZAR_Compl.pl 1 20110302000000 20110306000000 以下にperlのプログラムを掲載します。 #!/opt/perl/bin/perl ⇒入力パラメータチェック実行 # 日付1を年、月、日、時、分、秒に切り分け $L_Year = int(substr($ARGV[1],0,4)); $L_Mon = int(substr($ARGV[1],4,2)); $L_Day = int(substr($ARGV[1],6,2)); $L_Hour = int(substr($ARGV[1],8,2)); $L_Min = int(substr($ARGV[1],10,2)); $L_Sec = int(substr($ARGV[1],12,2)); # 取得日付チェック関数を実行する。 ($L_Ret, $L_Ret_Msg) = &MCPFLCF_DayExists($L_Year, $L_Mon, $L_Day, $L_Hour, $L_Min, $L_Sec); # 異常終了した場合 if( $L_Ret != 0 ){ # エラーを返却する。 return ($L_Error_End, "$L_Err_MSG_4 [$L_Ret_Msg]"); } # 日付1を秒に変換 $L_Time1 = timelocal($L_Sec, $L_Min, $L_Hour, $L_Day, $L_Mon - 1, $L_Year); ⇒同様に日付2も変換 # 日付1と日付2の差分を取る。 $L_TimeRet = ($L_Time2 - $L_Time1); # ファイルに書き込む為に、ファイルopenしてから書込み open (OUT,"> $outfile"); # 結果形式種別が1の場合 if($ARGV[0] == 1){ # 結果を日数で参照渡しする。 $L_LET = int($L_TimeRet / (60 * 60 * 24)); print OUT "$outfile"; } # 結果形式種別が2の場合 elsif($ARGV[0] == 2){ # 結果を秒で参照渡しする。 $L_LET = $L_TimeRet; print OUT "$outfile";; # CLOSEする close(OUT); シェルを実行すると、エラーにはなりませんが ファイルの出力もされません。 かなりどうしたらよいかわからない状態なので回答宜しくお願い致します。 足りない情報がありましたらご教授願います。

    • ベストアンサー
    • Perl
  • 標準出力とログファイルへの書き出し

    初歩的な質問ですみません。 以下のようにするとログファイルにechoの内容が出力 されますが、標準出力には出力されないようになります。 echo "log" >> test.log 標準出力とログファイル両方に出力したい場合はどのように記述 すればよいでしょうか?

  • teeコマンドを使わずにUNIXで標準出力とエラー出力を、ファイルと標準出力の両方に出すには?

    UNIX系のBシェルで、 コマンドを実行して、 その標準出力とエラー出力をログファイルに出力し、 かつ、同じものを標準出力にも出力したいのです。 また、その後でコマンドの戻り値$?をエラーチェックしたいです。 このため、パイプでteeコマンドを使用すると戻り値が上書きされてしまいます。 いったん一時ファイルに出力するしかないのでしょうか?

  • Windows版Perlの標準入力&標準出力

    Windows2000にActive Perl5.6をインストールしています。 標準入力をそのまま標準出力するプログラムを作っているのですが うまく動きません。 DOSコマンドの使い方が間違っているのか、Perlの書き方が間違って いるのか、それともWindows版のPerlではこのような使い方はできない のか、教えてください。 ■プログラムソース(c:\test.pl) while(<>){ print; } ■実行方法 c:\data.dat|test.pl>data2.dat ■データ(data.datの中身) こんにちわ ※実行するとdata2.datにdata.datの内容がCOPYされる 予定なのですが、正しく動きません。

    • ベストアンサー
    • Perl