Bashでecho / printfに条件付きでエスケープコードを飲み込むように指示する方法は?

Bashでecho / printfに条件付きでエスケープコードを飲み込むように指示する方法は?

タスクとして対話的に実行されるBashスクリプトがありますcron。インタラクティブに実行すると、端末にカラーテキストが出力されます。しかし、実行してcronみると端末がないので、[1;31m出力でも同様の結果がたくさん出てきます。

出力デバイスがエスケープコードをサポートしていない場合、Bashにエスケープコードを飲み込むように指示する方法はありますか?

これは以下に関連しています。Bashが色を印刷できるかどうかを確認する方法状態を確認することです。ただし、出力装置によって色の二重機能を維持しechoたり、両方を維持しながら呼び出すときにprintfできるだけ少ない変更をしたいと思います。

ベストアンサー1

端末で印刷していることを確認してください。lsこれはGNUやGNUのようなプログラムです。grep--color=auto

端末に印刷する場合でも、理論的には、色の変更エスケープシーケンスを理解できない可能性があります。ほぼすべての共通および最小共通端末は、これらの順序を理解する。私が見たすべてのX11ターミナルエミュレータ、screen、tmux、Linuxコンソール、* BSDコンソール、PuTTY、rxvt、Console2、ConEmuなど。

normal=
green=
if [ -t 1 ]; then
  normal=$'\e[0m'
  green=$'\e32m'
 fi
 echo "foobar ${green}OK${normal}"

テストは[ -t 1 ]標準出力と[ -t 2 ]標準エラーに関するものです。

拡張をサポートしていないシェルでは、$'…'次のように移植可能なエスケープ文字を生成できます。esc=$(echo _ | tr _ '\033')

おすすめ記事