bashにstderrメッセージを赤色で表示させる方法はありますか?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }
bashとzshで動作します。これを回答のb / cレピュテーションとして追加することはできません。
bashにstderrメッセージを赤色で表示させる方法はありますか?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }
bashとzshで動作します。これを回答のb / cレピュテーションとして追加することはできません。
回答:
command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
>&2
直前; done)
に追加することにより、stderr向けの出力は実際にはstderrに書き込まれます。プログラムの通常の出力をキャプチャする場合に役立ちます。
tput
、私の意見では少し読みやすくなっています。command 2> >(while read line; do echo -e "$(tput setaf 1)$line$(tput sgr0)" >&2; done)
IFS= read -r line
役立つはずですが、しません。理由はわかりません。
方法1:プロセス置換を使用する:
command 2> >(sed $'s,.*,\e[31m&\e[m,'>&2)
方法2:bashスクリプトで関数を作成します。
color()(set -o pipefail;"$@" 2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1
次のように使用します。
$ color command
どちらの方法でも、コマンドstderr
は赤で表示されます。
方法2の仕組みの説明を読み続けてください。このコマンドによって示されるいくつかの興味深い機能があります。
color()...
— colorというbash関数を作成します。set -o pipefail
—これは、出力が別のコマンドにパイプされるコマンドのエラー戻りコードを保持するシェルオプションです。これは、外側のシェルのpipefailオプションを変更しないように、括弧で作成されたサブシェルで行われます。 "$@"
—新しいコマンドとして関数の引数を実行します。 "$@"
に等しい"$1" "$2" ...
2>&1
-リダイレクトstderr
にコマンドのをstdout
、それがなるようsed
さんstdin
。>&3
—の省略形で1>&3
、これstdout
は新しい一時ファイル記述子にリダイレクトします3
。 後で3
ルーティングされますstdout
。sed ...
—上記のリダイレクトのため、sed
's stdin
はstderr
実行されたコマンドのものです。その機能は、各行をカラーコードで囲むことです。$'...'
バックスラッシュでエスケープされた文字を理解させるbashコンストラクト.*
—行全体に一致します。\e[31m
—次の文字を赤にするANSIエスケープシーケンス&
— sed
一致した文字列全体(この場合は行全体)に展開する置換文字。\e[m
—色をリセットするANSIエスケープシーケンス。>&2
-の略記1>&2
、これはリダイレクトsed
さんstdout
へstderr
。3>&1
-一時的なファイルディスクリプタをリダイレクト3
バックにstdout
。zsh
ますか?
zsh: color()(set -o pipefail;"$@" 2>&1 1>&3|sed $'s,.*,\e[31m&\e[m,'1>&2)3>&1
また、stderredをチェックアウトすることもできます:https : //github.com/sickill/stderred
.bashrc
)使用することにためらっています。でもありがとう!
stderrを永続的に赤にするbashの方法は、「exec」を使用してストリームをリダイレクトすることです。以下をbashrcに追加します。
exec 9>&2
exec 8> >(
while IFS='' read -r line || [ -n "$line" ]; do
echo -e "\033[31m${line}\033[0m"
done
)
function undirect(){ exec 2>&9; }
function redirect(){ exec 2>&8; }
trap "redirect;" DEBUG
PROMPT_COMMAND='undirect;'
以前にこれを投稿しました:STDOUTとSTDERRのフォントの色を設定する方法
source ~/.bashrc
2回使用すると、基本的に端末がロックします。
BalázsPozsárの答えを純粋なbashで実装するラッパースクリプトを作成しました。$ PATHおよびprefixコマンドに保存して、出力を色分けします。
#!/ bin / bash if [$ 1 == "--help"]; それから echo「コマンドを実行し、発生したすべてのエラーを色付けします」 echo "例:` basename $ {0} `wget ..." echo "(c)o_O Tync、ICQ#1227-700、お楽しみください!" 出口0 fi #すべてのエラーをキャッチする一時ファイル TMP_ERRS = $(mktemp) #コマンドを実行 "$ @" 2>>(行の読み取り中; do echo -e "\ e [01; 31m $ line \ e [0m" | tee --append $ TMP_ERRS; done) EXIT_CODE = $? #すべてのエラーを再度表示する if [-s "$ TMP_ERRS"]; それから echo -e "\ n \ n \ n \ e [01; 31m ===エラー=== \ e [0m" 猫$ TMP_ERRS fi rm -f $ TMP_ERRS #終了 $ EXIT_CODEを終了
このような関数を使用できます
#!/bin/sh
color() {
printf '\033[%sm%s\033[m\n' "$@"
# usage color "31;5" "string"
# 0 default
# 5 blink, 1 strong, 4 underlined
# fg: 31 red, 32 green, 33 yellow, 34 blue, 35 purple, 36 cyan, 37 white
# bg: 40 black, 41 red, 44 blue, 45 purple
}
string="Hello world!"
color '31;1' "$string" >&2
>&2を追加してstderrに出力します
O_o Tyncのスクリプトを少し修正したバージョンがあります。OS X Lion向けにこれらのMODを作成する必要がありましたが、ラップされたコマンドが実行される前にスクリプトが完了することがあるため、完璧ではありません。睡眠を追加しましたが、もっと良い方法があると確信しています。
#!/bin/bash
if [ $1 == "--help" ] ; then
echo "Executes a command and colorizes all errors occured"
echo "Example: `basename ${0}` wget ..."
echo "(c) o_O Tync, ICQ# 1227-700, Enjoy!"
exit 0
fi
# Temp file to catch all errors
TMP_ERRS=`mktemp /tmp/temperr.XXXXXX` || exit 1
# Execute command
"$@" 2> >(while read line; do echo -e "$(tput setaf 1)$line\n" | tee -a $TMP_ERRS; done)
EXIT_CODE=$?
sleep 1
# Display all errors again
if [ -s "$TMP_ERRS" ] ; then
echo -e "\n\n\n$(tput setaf 1) === ERRORS === "
cat $TMP_ERRS
else
echo "No errors collected in $TMP_ERRS"
fi
rm -f $TMP_ERRS
# Finish
exit $EXIT_CODE
このソリューションは私のために働いた:https : //superuser.com/questions/28869/immediately-tell-which-output-was-sent-to-stderr
私はこの関数を.bashrc
orに入れました.zshrc
:
# 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
}
次に、例えば:
$ rse cat non_existing_file.txt
赤い出力が表示されます。
set -o pipefail;
前(eval
に追加できます
"
、引数にスペースを保持するためにevalを追加します
xargsとprintfを使用:
command 2> >(xargs -0 printf "\e[31m%s\e[m" >&2)