Bash ここでは、ドキュメントでANSIカラーエスケープコードを使用できますか?

Bash ここでは、ドキュメントでANSIカラーエスケープコードを使用できますか?

Bashスクリプトでメッセージを印刷していますが、その一部を着色したいと思います。

#!/bin/bash

normal='\e[0m'
yellow='\e[33m'
cat <<- EOF
    ${yellow}Warning:${normal} This script repo is currently located in:
    [ more messages... ]
EOF

tmuxただし、端末で(内部的にgnome-terminal)実行するときANSIエスケープ文字\たとえば、表形式で印刷してみてください。

\e[33mWarning\e[0m This scr....

色分けしたい部分をprintfここのドキュメントの外側のコマンドに移動すると機能します。たとえば、次のように動作します。

printf "${yellow}Warning:${normal}"
cat <<- EOF
    This script repo is currently located in:
    [ more messages... ]
EOF

ソースman bash– このドキュメント:

パラメーターおよび変数拡張、コマンド置換、算術拡張、またはパス名拡張は実行されません。言葉。その中に文字があれば言葉引用されたので区切り記号引用符を削除した結果です。言葉、ここのドキュメントの行は拡張されません。もし言葉引用符がない場合、この文書のすべての行にはパラメータ拡張、コマンド置換、および算術拡張があります。後者の場合、文字の順序は次のとおりです。\<改行>無視され、文字とを引用するために\使用する必要があります\$`

これがANSIエスケープコードにどのような影響を与えるかわかりません。catここに記載されているBashドキュメントでANSIエスケープコードを使用できますか?

答え1

スクリプトでは、これらの操作は

normal='\e[0m'
yellow='\e[33m'

その文字を入れて文字通り変数として、つまり\e[0mエスケープシーケンスの代わりに。たとえば、printf構文エスケープ文字(またはその一部のバージョン)を使用できます。echo

normal=$(printf '\033[0m')
yellow=$(printf '\033[33m')

tputただし、正しく設定された端末で動作するため、使用する方が良いでしょう。

normal=$(tput sgr0)
yellow=$(tput setaf 3)

printfあなたの例を見ると、エスケープ文字バージョンとして処理を使用しているようです\e(これはシステムで動作することができますが、通常は他のシステムに移植することはできません)。これを見るには、以下を試してください。

yellow='\e[33m'
printf 'Yellow:%s\n' $yellow

あなたは見るでしょう言葉数値:

Yellow:\e[33m

エスケープシーケンスの代わりに。それらをprintf形式にしてprintf(可能であれば)私たちに解釈するように教えてください。

追加資料:

答え2

この割り当ては変数にエスケープ文字を配置しません。

normal='\e[0m'                  yellow='\e[33m'

これを行うには、echo -e printfまたは$'...'(bashで)が必要です。

bashを使用しているので、次のものも使用できます。

normal=$'\e[0m'                 yellow=$'\e[33m'

$前に文字列を書き留めます'\e[0m'

しかし、エスケープ文字を取得する移植可能な方法は、以下のようにprintfです。

normal="$(printf '\033[0m')"    yellow="$(printf '\033[33m')"

エスケープ文字(033)の8進数値は、すべてのPOSIXシェルで有効です。

関連情報