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

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

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

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

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

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

プログラムの出力やエラー表示、キーボードからの入力などといった端末に表示されたものすべてを記録したい場合には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/

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

質問者からのお礼

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

質問者からの補足

お礼が大変遅くなりまして申し訳ございません。 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があるなどの情報だけは発見できたのですが。。。 宜しくお願い致します。

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

  • 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 やり始めたばかりです。宜しくお願いします。 入力ファイル data.txt があるとします。 data.txt は、 123 456 789 333 555 777 以上のようなテキストファイルといたします。このファイルを 以下の様に100分の1にして出力したい。 1.23 4.56 7.89 3.33 5.55 7.77 と言うことで、この場で教えていただきました。それが、以下です。 #!/usr/bin/perl open(IN, "data.txt") or die ; @x = <IN>; close (IN); foreach $line (@x){ chomp($line); @elms = split(' ',$line); foreach $data (@elms){ print $data/100," "; } print "\n"; } おかげ様でこれはこれで上手く動きました。そこで、出力値をファイルに 書き込みたいのです。 もちろん、以下の様な方法でファイルに 書き込めるのは判っております。 計算プログラム.pl > outfile.txt しかし、上のプログラムをベースにファイルに書き込めないかと色々と 試してはみましたが、どうも上手く行きません。 どなたか教えて頂けないでしょうか? 宜しくお願い申し上げます。

    • ベストアンサー
    • Perl
  • perlでの出力先設定

    perlの出力結果を.txtにして出力しているのですが、出力先が.plのあるところ以外に指定することはできるのでしょうか? <STDIN>でtxtデータを読み込んでいるのですが、例えば入力したtxtがCドライブのAというフォルダにある場合Aのフォルダ内に出力結果を出し、WドライブのBというフォルダのtxtを入力した場合はBのフォルダ内に出力結果を出したいです(入力したtxtと同じ場所に出力したい)。 わかる方がいたら教えてください、お願いします。m(_ _;m)

  • 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