2017-11-03 9 views
1

stdoutとstderrをタイムスタンプとともにログファイルに記録し、それを画面に表示したい。 stderrを標準出力にリダイレクトし、タイムスタンプをawkで追加してログファイルに追加します。 しかし、正しいエラーコードを取得するのに問題があります。ここBASH:stdoutとstderrをファイルに書き出して画面に表示する - >正しいエラーコードを得る

ロギング無し例:

$ less notexists.txt 
notexists.txt: No such file or directory 
$ echo $? 
1 

エラーコードここでロギングを有する例示

正しい:

$ less notexists.txt 2>&1 | awk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0; fflush(); }' | tee -a log.txt 
[2017-10-23 17:19:59] notexists.txt: No such file or directory 
$ echo ${PIPESTATUS[*]} 
0 0 0 

すべての3つのセクションのエラーコードが0であるが、最初のセクションは1でなければなりません。 私はこの問題がstderrのリダイレクトになる可能性があると思います。

タイムスタンプ付きのstdoutとstderrをログファイルに記録し、画面に表示して正しいエラーコードを取得する方法はありますか?

stderrをリダイレクトするのではなく複製することはできますか?

+1

問題は、標準出力として端末以外のものを持つ「less」です。 '{less noexists.txt; echo $?; } |ネコ。 – chepner

答えて

1

明らかに、標準出力が端末でない場合、lessはゼロ以外の終了ステータスを持ちません。強制すると、ログファイルに標準出力が表示されなくなりますが、予想される終了ステータスが得られます。ここで


は、私が思うに、less v487から関連するコードです:標準出力が端末でないときに

if (!is_tty) 
     { 
       /* 
       * Output is not a tty. 
       * Just copy the input file(s) to output. 
       */ 
       SET_BINARY(1); 
       if (nifile() == 0) 
       { 
         if (edit_stdin() == 0) 
           cat_file(); 
       } else if (edit_first() == 0) 
       { 
         do { 
           cat_file(); 
         } while (edit_next(1) == 0); 
       } 
       quit(QUIT_OK); 
     } 

それが開こうとしたすべてのエラーを無視する以外、lessは単に、catように振る舞いますその入力。何が起こっても、ただ終了します。

おそらく、これはバグですが、私は2分間すべてをソースコードを見ているので、この動作の根拠があるかどうかわかりません。

+0

私はバグレポートを提出しました。私はメンテナーの考えと一緒に報告します。 – chepner

関連する問題