bash:-xログをファイルに設定


18

set -x詳細/デバッグ出力を行うシェルスクリプトがあります。

#!/bin/bash

set -x
command1
command2
...

出力は次のようになります。

+ command1
whatever output from command1
+ command2
whatever output from command2

私の問題は(によって引き起こされるシェル出力は、あるset -x)(コマンドの出力と混合し、stderrに行きcommand1command2...、)。画面上に「通常の」出力(スクリプトwoudなしで実行されるようなset -x)と、bashの「余分な」出力を別々にファイルに入れていただければ幸いです。

だから私はこれを画面に表示したいと思います:

whatever output from command1
whatever output from command2

そしてこれはログファイルにあります:

+ command1
+ command2

(ログファイルにすべてが揃っている場合も問題ありません)

set -x 2> file明らかdoens'tそれはsetコマンドの出力ではありませんので、右有効になりますが、それはbashの動作を変更。

bash 2> fileこのシェルで実行されるすべてのコマンドのstderrもリダイレクトするため、スクリプト全体に使用しても正しいことは行われません。そのため、コマンドのエラーメッセージは表示されません。


回答:


20

このServerFaultの回答に基づいて、標準出力をinteruptingせずにログファイルに送信bashの-x出力は、bashの最近のバージョンには、BASH_XTRACEFD特別の出力のための代替ファイルディスクリプタを指定しますset -x

たとえば、次のことができます

#!/bin/bash

exec 19>logfile
BASH_XTRACEFD=19

set -x
command1
command2
...

次のコマンドの通常の標準出力と標準エラーストリームを保持しながらset -x、ファイルへの出力を送信しlogfileます。

fd 19の使用は任意であることに注意してください-使用可能な記述子である必要があります(つまり、0、1、2、または既に割り当てた別の番号ではありません)。


実際にはbashトレースログを個別に保存しますが、2つの出力(画面上のstdout + stderrとログファイルのbashトレース)が完全に同期していないため、読み取りが非常に困難になります。私が今投稿したソリューションをご覧ください。
-redseven

4

1年以上後、画面に「通常の」出力(stdout + stderr-bashトレース)とファイル(bd.log)にすべて(stdout + stderr + bashトレース)を含める適切なソリューションを見つけました。 :

exec   > >(tee -ia bash.log)
exec  2> >(tee -ia bash.log >& 2)
exec 19> bash.log

export BASH_XTRACEFD="19"
set -x

command1
command2

それは、スチールドライバーの答えとこれの答えの組み合わせです。
ジャーノ

3

Steeldriver はあなたに 1つのアプローチを与えました。または、単にSTDERRをファイルにリダイレクトできます:

script.sh 2> logfile

ただし、これは、set -xオプションによって作成された出力と生成された他のエラーメッセージの両方がファイルに送られることを意味します。Steeldriverのソリューションset -xは、おそらく必要な出力のみをリダイレクトします。


「... set -xオプションによって作成された出力と、生成されたその他のエラーメッセージの両方がファイルに送られます。」そして、それが私には機能しない理由です。私の主な問題は、このbashの出力がすべてstderrに送られるため、「本当のエラー」が簡単に表示されないことです。コマンドエラーメッセージをリダイレクトすると、別の方法で「本当のエラー」が隠されます。
-redseven

@redseven私は、あなたが求めていることはそれほど明確ではないのではないかと心配しています。質問を編集して明確にできますか?標準出力にならないものには「出力」という用語の使用を避けてください。i)通常の出力を分離しますか?ii)コマンドによってスローされたエラーとiii)-xを設定しますか?スチールドライバーの答えは十分ではありませんか?そうでない場合は、コピーできる簡単なスクリプトを見せて、どのように動作させるかを教えてください。
テルドン

@steeldriverはすでに完全に質問に答えています。
-redseven

@redsevenああ、それからクール。あなたのコメントはとても後で来たので、私はあなたがまだ何かを必要としていると思いました、そして、steeldriverの答えがあなたの問題を解決するのにどのように失敗したかわかりませんでした。それはすべてソートされてうれしいです。
テルドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.