stderr
コマンドの出力に色を割り当てるには、次の機能があります。
red=`tput setaf 1`
colorerr() {
(trap 'tput sgr0' EXIT; eval "$* 2> >(echo -n \"${red}\"; cat -;)")
}
たとえば、
colorerr "bash -c 'cd ${WEB_APP_DIR}; npm run-script build'"
スクリプトはset -e
、trap ... ERR
およびを使用して、trap ... EXIT
失敗時に行番号とスタックトレースを報告します。渡されたコマンド文字列がcolorerr
失敗した場合を除き、すべてがうまく機能し、エラーをキャッチしてより良いレポートを提供したいと思います(関数内でエラーが発生したことを知らせるのは役に立たcolorerr
ないからです)。
標準|| ...
設定を試しましたが、サブシェル内でエラーがcolorerr
発生しましたERR
trap
。テストで以下を試しました。
(trap 'tput sgr0' EXIT; eval "$* 2> >(echo -n \"${red}\"; cat -;)") ||
true
しかし、ERRトラップは依然としてトリガーされます。|| true
いつものようにエラーコードが「0」に設定されていないのはなぜですか?
答え1
実際には答えではありませんが、解決策です。この試み:
col-err() { "$@" 2> >(grep --color .) ; }
colorerr
構文は質問の関数とは若干異なります。 〜のためにcol-err
、〜のためにいいえ実行するコマンドを引用すると、次のようになります。
col-err bash -c 'cd ${WEB_APP_DIR}; npm run-script build'
どこでも実行できる例:
col-err bash -c 'ls $SHELL ${SHELL}_no_such ; echo
ls -l $HOME ${HOME}_no_such | head -2'
col-err
呼び出しは変数とgrep
一緒に使用されます$GREP_COLORS
。色を緑色(ms=01;32
下の最初の色)に一度だけ変更します。
GREP_COLORS='ms=01;32:mc=01;33:sl=:cx=:fn=35:ln=32:bn=32:se=36' \
col-err bash -c 'ls $SHELL ${SHELL}_no_such ; echo
ls -l $HOME ${HOME}_no_such | head -2'
注:カラー文字列は以下で調整されています。クリキス回答「異なるgrepごとに異なる色を使用してください」。