stderrに送信された出力をすぐに通知する


8

タスクを自動化する場合、最初に手動でテストするのが賢明です。ただし、stderrに送られるデータがそのようにすぐに認識され、stdoutに送られるデータと区別可能で、すべての出力を一緒にしてイベントのシーケンスが何であるかが明らかである場合に役立ちます。

最後に良いのは、プログラムの終了時に戻りコードが出力された場合です。

これらはすべて自動化に役立ちます。はい、プログラムの終了時に戻りコードをエコーできます。また、はい、stdoutとstderrをリダイレクトできます。stdoutを黒で表示し、stderrをインターリーブして赤で表示し、終了コードを最後に出力するシェル、スクリプト、または使いやすいリダイレクターです。

そのような獣はいますか?[問題がある場合は、Mac OS XでBash 3.2を使用しています]。


更新:すみません、これを見てから数か月が経ちました。私は簡単なテストスクリプトを思いついた:

#!/usr/bin/env python
import sys

print "this is stdout"
print >> sys.stderr, "this is stderr"
print "this is stdout again"

私のテストでは(おそらく物事のバッファリング方法が原因で)、rseとhiliteはstdoutからすべてを表示し、次にstderrからすべてを表示します。fifoメソッドは正しい順序を取得しますが、stderr行に続くすべてのものを色付けするように見えます。indがstdinとstderrの行について文句を言い、次にstderrからの出力を最後に置きました。

これらの解決策のほとんどは、最後の出力だけがstderrに送られることは一般的ではないため、実行可能ですが、それでも、少しだけうまく機能するものがあるとよいでしょう。


私のように怠惰な(または指が痛い)場合は、以下の解決策(例:rse zsh)でサブシェルを取得し、すべてのコマンドでstderrをcolorizeできます。
バイアス

回答:


3

stderredをチェックすることもできますhttps : //github.com/sickill/stderred


残念ながら、OPのようなMacユーザーにとってstderredは「open」と「mvim」を中断します。
AlcubierreDrive

これは非常にうまく機能し、その動作方法により、正しい順序で出力順序を取得します。一度設定してプロファイルで有効にすると、stderrに書き込みが行われるたびに赤いメッセージが表示されます。
クリントンブラックモア


9

FIFOを使用するクレイジーな方法を考案しました。

$ mkfifo foo
$ grep --color . foo &
$ your_command 2>foo

stderrの出力を個別にしたい場合は、2つの個別のシェルを開いて、「grep --color . foo」なしで1つで「」を実行してから、もう1つのシェルで&コマンドを実行できます(それでも2>foo)。grep1つはstderrを取得し、mainはstdoutを取得します。

stderr出力がFIFOを介してにルーティングされるため、これは機能しgrep --colorます。そのデフォルトの色は赤です(少なくとも私にとっては)。完了したらrm、FIFO(rm foo)だけです。

警告:これが出力順序をどのように処理するかは本当にわかりません。テストする必要があります。


それはかなり滑らかです。
クリントンブラックモア

7

はい、可能です。実際の例については、このサイトの「STDERRを赤にする」セクションを参照してください

基本的なコードはこれです

# Red STDERR
# rse <command string>
function rse()
{
    # We need to wrap each phrase of the command in quotes to preserve arguments that contain whitespace
    # Execute the command, swap STDOUT and STDERR, colour STDOUT, swap back
    ((eval $(for phrase in "$@"; do echo -n "'$phrase' "; done)) 3>&1 1>&2 2>&3 | sed -e "s/^\(.*\)$/$(echo -en \\033)[31;1m\1$(echo -en \\033)[0m/") 3>&1 1>&2 2>&3
}

関数自体に簡単な説明があります。STDOUTとSTDERRを移動するので、sedはSTDERRを1にして、色を付けてから元に戻します。ここでは、ファイルストリーム3を一時変数と考えてください。

呼び出しはかなり簡単です

rse commands

ただし、特定の呼び出しは期待どおりに機能しません。注意事項はすべてリンク先のページに記載されています。

ところで、私はフォームの解決策を伴うことも可能だと思います

commands | rse 

ここで、rseは出力を色分けします。

私はこれをしているように見えるこのハイライトプロジェクトも見つけました。私はまだ試していませんが、あなたが探しているものかもしれません。

hiliteは、指定したコマンドを実行する小さなユーティリティで、stderrに出力されたものをすべて強調表示します。これは主にビルド​​で使用するために設計されており、警告やエラーが痛々しい決まり文句のように目立つようにします。

その他の関連プロジェクト:


rseとhiliteは、私が望むものにかなり近いです。
クリントンブラックモア

1

別のプログラムはindです:

http://www.habets.pp.se/synscan/programs.php?prog=ind(ハイパーリンクを自分でアセンブルする必要があります。回答ごとに複数のポイントを用意する必要はありません)。スクリーンショットとスクリーンキャストさえあります。

それはサブプロセスをptyで実行しますが、他のものはおそらくそうしません。stderrは即座にターミナルでフラッシュされ、ttyでない場合はstdoutが完全にバッファリングされるため、これは順序が重要な場合に重要になります(多くの場合そうなります)。

完全な説明については、これを参照してください:http : //blog.habets.pp.se/2008/06/Buffering-in-pipes

また、indは対話型プログラムと制御文字で動作します。「ind bash -i」で起動すると、Bashは通常のように機能します。

これはCtrl-Pなどを維持しながら色を与えるのに役立ちます。

ind -P $(echo -ne '\033[31;1m') -p $(echo -ne '\033[0m') bash -i

1

stderrの出力を強調表示するための多くの応答があります。私はかなり簡単に1つだけ追加できます-コマンドにアタッチする1行に:

command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m"; done)

しかし、毎回この後コマンドを追加する必要があります。

私個人的には、@ nagulで言及されている可能性のように、bashrcに追加されたrse関数です。

しかし、終了コードを印刷するためのソリューションを追加したいと思います。この値をbashプロンプト行の先頭に追加できます。

hostname$ command
  Some error occurred. Returned exit code.
EC hostname$

ECはコマンドの終了コードです。

終了コードが0の場合は出力されないように設定しましたが、他の値は次のプロンプトの前に赤色で出力されます。

トリック全体は〜/ .bashrcで行われます:

my_prompt() {
 EXITSTATUS="$?"
 RED="\[\033[1;31m\]"
 OFF="\[\033[m\]"

PROMPT="${debian_chroot:+($debian_chroot)}\h \$ "

if [ "${EXITSTATUS}" -eq 0 ]; then
   PS1="${PROMPT}"
else
   PS1="${RED}$EXITSTATUS${OFF} ${PROMPT}"
fi
}

PROMPT_COMMAND=my_prompt

プロンプトラインは、デフォルトではPS1変数によって定義されます。ここにあるものを変数PROMPTにコピーし、終了コードの有無にかかわらずPS1変数を作成します。

BashはプロンプトにPS1変数の情報を表示します。


これはまさに私が探していたものです、ありがとう!
Dylon、2017年

1

ありますannotate-outputユーティリティは、(devscriptsあなたが色なしでそれをしたいと思った場合、Debianパッケージ)

$ annotate-output /tmp/test.py    
14:24:57 I: Started /tmp/test.py
14:24:57 E: this is stderr
14:24:57 O: this is stdout
14:24:57 O: this is stdout again
14:24:57 I: Finished with exitcode 0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.