• 締切済み

UNIX teeコマンドについて

あるテストプログラムの実行結果をteeコマンドで、ログに追加出力しようとしています 以下の1.変更前の様にシェルスクリプトを作成しました。 このシェルスクリプトを実行するとteeコマンドが正常終了するので $? が常に0になってしまい、必ずOKになってしまいます 急いでいたので2.のように修正したのですが、テンプファイルを使わないでもうちょっとシンプルに作成する方法をご存知の方教えてください 1.変更前 ./testpgm | tee -a logfile.txt  if [ $? -eq 0 ] ; then  echo "OK,testpgm," | tee -a logfile.txt else echo "NG,testpgm," | tee -a logfile.txt fi 2.変更後 ./testpgm > tempfile.txt if [ $? -eq 0 ] ; then cat tempfile.txt>>logfile.txt cat tempfile.txt echo "OK,testpgm," | tee -a logfile.txt else cat tempfile.txt>>logfile.txt cat tempfile.txt echo "NG,testpgm," | tee -a logfile.txt fi rm tempfile.txt OSはAIXで、シェルはshのみ使用可です

みんなの回答

  • splwtr
  • ベストアンサー率16% (75/461)
回答No.2

tee でなく script はどうでしょうか? テストプログラムのteeは取り除き。 $ script log $ <テストプログラム> : <何らかの出力> $ exit で、ログが log に入ってます。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

ちゃんと動作するかどうか未検証ですが、 ( if ./testpgm ; then  echo "OK,testpgm," else echo "NG,testpgm," fi ) 2>&1 | tee -a logfile.txt

関連するQ&A

  • Linux制御文

    Linuxを使い始めて、3ヶ月目のど素人です if [ $1 = 1 ];then echo A,a1,OK echo A,a2,OK echo B,b1,OK echo B,b2OK elif [ $1 = 2 ];then A,a1,OK A,a2,NG B,b1,OK B,b2,NG elif [ $1 = 3 ];then A,a1,NG A,a2,NG B,b1,NG B,b2,NG fi スクリプトの中身(質問部分) cat ($1か$2か$3) | soet | cut -d ,-f1 | uniq -c    ↑ここにファイルを入れたい スクリプトに引数$1か$2を渡した時 新しくファイル出力して、そのファイルが、cat の場所に入れたい 解りにくくて申し訳ないですが、困ってます!どうか宜しくお願いします

  • UNIX

    UNIXの課題をやっていて、ここまで出来たのですが???の部分が 分かりません;誰か教えて頂けると助かります; 時間があれば説明も加えて頂けたら幸いです; #!/bin/bash #ふたつの引数の大小を判断し表示するシェルスクリプト if [ $# -lt 2 ] then echo "引数が足りません" exit fi cmp1=$1 cmp2=$2 if [ $cmp1 -gt $cmp2 ] then echo "$cmp1 ??? $cmp2" elif [ $cmp1 ??? $cmp2 ] then echo "$cmp1 = $cmp2" else echo "$cmp1 ??? $cmp2" fi

  • シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕

    シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕方が分かりません。 -------------------------------------------------- #!/bin/sh . GetYesNo.sh          #外部シェルスクリプトを読み込んで... GetYesNo $1           #このGetYesNoの戻り値は0か1を出力するようにする。 if[ ??? -eq 0 ]; then      #"???"の部分に何を入力すれば良いか分かりません。 echo "真(0)です。" else echo "偽(0以外)です。" fi -------------------------------------------------- 戻り値が0か1しか出力しない外部シェルスクリプトを読み込んで、その戻り値をtestコマンドを利用して、0か1のどちらかを判定して、それぞれの出力を出したいけれど、どうやって出来ますでしょうか。 色々な方法を試してみましたが、ダメでした。 上記のコードの書き間違いがあると思いますが、あったらご指摘をお願いします。

  • cronを介してのscpの挙動おかしい

    CentOS5系(64bit) expect5.45 Tcl8.6.0 Tk8.6.0 下記のデータダウンロードのスクリプトをcronに設定して自動実行していますが、 エラーも吐き出されずデータがダウンロードされません。 しかしながら、./download.shとコマンドを打鍵するとデータがダウンロードされます。 PCが壊れる前には、正常に動作していたスクリプトファイルなのです。 新しいPCに環境を再構築しまして、挙動がおかしいのですが、 インストール等がうまくいってないって事でしょうか。 お詳しい方、ご教授願えれば幸いです。 ー略- alive_time=3600 logFile=/home/admin/scp.log echo `date` >> $logFile expect -c " log_file $logFile set timeout $alive_time spawn scp $host $local sleep 1 expect { \"Are you sure you want to continue connecting (yes/no)?\" { send \"yes\r\" expect \"password:\" send \"${passwd}\r\" } \"password:\" { send \"${passwd}\r\" } } expect { \"denied\" { exit 2 } \ eof { sleep 1 exit 1 } } " ret=$? if [ $ret -eq 0 ] then echo "abort" >> $logFile else if [ $ret -eq 1 ] then echo "done" >> $logFile else if [ $ret -eq 2 ] then echo "fail" >> $logFile fi fi fi exit $ret

  • 【sh】tee コマンドの代替方法

    お世話になります。 パイプを使わずにtee コマンドと同じように振る舞わせる方法がわかりません。 なにかよい知恵はありませんでしょうか。。。 今まで、bashスクリプトの中で 関数 | tee -a ログファイル名 という形式でログファイルを出力していたのですが 関数の中でシェル変数を書き換える必要があってパイプが使えなくなってしまいました。 リアルタイムに関数の標準出力をターミナル出力しつつ、ログファイルにも保存していきたいのですが こういう場合、どうすればよいのでしょうか? とりあえず touch ログファイル名 tail -f ログファイル名 & 関数 sleep 2 kill %1 という形で、暫定的に逃げているのですが kill したときに出力されるメッセージが消せずにかっこわるいので できればこの方法は変更したいです。 ご教示ください。

  • シェルスクリプトのifでの正規表現で\wが利用不可

    なのですがどうすればいいでしょうか? 端末で x=a.out;if [[ $x =~ \.\w+$ ]];then echo ok;else echo ng;fi ng となり\wが使えません 一方 x=a.out;if [[ $x =~ \.[0-9a-z]+$ ]];then echo ok;else echo ng;fi ok です \wの代わりに[0-9a-z]+は長すぎるので何とかしたいのです 何かいい方法はないでしょうか? よろしくお願いします

  • Unix初心者による初心者シェルプログラミングです。

    Unix初心者による初心者シェルプログラミングです。 以下のようなコマンドを羅列しただけの スクリプトが300行(実質100行ぐらい)が漸くできるようになりました。 これだけで、おばかさんな私は進化してます。が・・・ 対象となる、hoge.txtは、同ディレクトリ内に別名で、200ファイル有ります。 このスクリプトがその別名、200ファイルへと対象になります。 と云う事はファイル名分の200ファイル分スクリプトを編集して用意しなくては いけなくなる。 となると・・・ 別の事をしないといけませんよね。 どうやら、同ディレクトリ内にある、全ての .txt ファイルに対してこの スクリプトを実行させるには・・・ (よくわかりませんが・・・) FILE=`/home/foo/*.txt` みたいな・・・(全然違うと思っていますが、イメージで) /home/foo/ 内の .txt ファイルを一ファイルずつ読み込んで、実行させる方法が あると思うのですが・・・ 全てを教えて貰うつもりはありません。 学習していきます。 でも、疲れてきました。 がしかし、やらなくちゃいけません。 ヒント下さい。 お願いします! > cat hogehoge.sh #!/usr/bin/sh DAY=`/usr/xpg4/bin/date '+%Y/%m/%d%a'` HUMAN=`/usr/ucb/whoami` TIME=`/usr/xpg4/bin/date '+%H:%M:%S'` echo echo "$DAY : $HUMAN : PID $$" echo echo "$0" echo echo "$TIME Let's start!" echo echo "ls -l /home/foo/hoge.txt" ls -l /home/foo/hoge.txt echo echo "cat -n /home/foo/hoge.txt | head -15" cat -n /home/foo/hoge.txt | head -15 echo echo "sed -f /home/foo/script.sed /home/foo/hoge.txt > /home/foo/new-hoge.txt" sed -f /home/foo/script.sed /home/foo/hoge.txt > /home/foo/new-hoge.txt echo echo "ls -l /home/foo/new-hoge.txt" ls -l /home/foo/new-hoge.txt echo echo "cat -n /home/foo/new-hoge.txt | head -18" cat -n /home/foo/new-hoge.txt | head -18 echo echo "sed -e '1d' -e '14d' /home/foo/new-hoge.txt > /home/foo/renewal-hoge.txt" sed -e '1d' -e '14d' /home/foo/new-hoge.txt > /home/foo/renewal-hoge.txt echo echo "ls -l /home/foo/renewal-hoge.txt" ls -l /home/foo/renewal-hoge.txt echo echo "diff /home/foo/new-hoge.txt /home/foo/renewal-hoge.txt" diff /home/foo/new-hoge.txt /home/foo/renewal-hoge.txt echo echo "sed -e '13d' -e 's/^iranai/hitsuyou/' /home/foo/renewal-hoge.txt > /home/foo/new-hoge.txt" sed -e '13d' -e 's/^iranai/hitsuyou/' /home/foo/renewal-hoge.txt > /home/foo/new-hoge.txt echo echo "ls -l /home/foo/new-hoge.txt" ls -l /home/foo/new-hoge.txt echo ・ ・ ・ ・ ・ ・ ・ ・ 300

  • 【ど素人】シェルスクリプトで、引数の形式チェック【ヘルプミー】

    bashで書いたシェルスクリプトで、 引数を正規表現を用いて入力形式チェックしたいと思っています。 いい方法が思いつかず、とりあえず動作はする以下のスクリプトを 組みました。 echo $1 | grep "正規表現" > /dev/null if [ $? -eq 0 ]; then # あってるときの処理 else # ちがうときの処理 fi どうも、他に良い方法がある気がしてなりませんが、 どうでしょうか? 良い方法があれば教えてください。 また、(ないとは思うけど)この方法が一般的ということであれば、 その旨教えていただけるとありがたいです。 よろしくお願いします。

  • シェルスクリプトでのエラー時の処理について

    HTMLにシェルスクリプトを実行するSSIを埋め込んで、 その実行結果をHTML側に出力する、という処理をしようとしております。 大まかな処理内容は、指定の場所のファイルの有無をチェックして それにより"ok"か"ng"かの文字列をHTMLに出力する、というものです。 ====以下、HTMLソース(前後省略)==== <br> 結果は:<!--#exec cmd="./output.sh" --> <br> ====ここまで==== ====以下、シェルスクリプトソース==== #!/bin/sh CHECKFILE=/aaa/bbb/check.txt TEXTA=ok TEXTB=ng if [ -f $CHECKFILE ] ; then echo $TEXTA else echo $TEXTB fi exit ====ここまで==== この処理自体は特に問題無さそうなのですが、 この中に途中で異常終了した際のエラー処理を組み込むことによって、 異常時には固定で"ok"を出力して終了するようにしたいのです。 trap "echo 'ok'; exit" HUP INT QUIT KILL TERM や trap "echo 'ok'; exit" 1 2 3 9 15 などのtrapを入れたりもしたのですが、 思い通りには動かず、結果を返すことなく終了してしまいます。 このような場合、trapに限らず何か良い方法はありますでしょうか。 何かご存知の方おりましたらご助言頂けますでしょうか。。 よろしくお願いいたします。

  • unix上で ./configurの形式のコマンド

    unix上で ./configure(そのあとに、makeコマンドが続くような形式 で実行できるファイルの事を知りたいのですが、どういったワードで調べたら宜しいでしょうか? シェルの形式に近いのかな?と思ったのですが、コメントアウトされていて調べきれていません。 ./configure内は以下の通りです #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.65 for cvc3 devel. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else 以下略