私が覚えている限り、私は個人的にbashを使用するときに出力テキストの色を変更するために次の方法を使用します。
red=$'\033[1;31m'
nc=$'\033[0m'
echo "${red}This is red text$nc"
macOSで使用してもLinuxで使用しても、私はいつも効果的です。好奇心でこれがなぜ機能するのかをよりよく理解するために調査を行った結果$
()が含まれていないいくつかのred='\033[1;31m'
答え/例が見つかりました。いくつかのテストを行った後を使用しないと、$
出力色は赤に変わらず、文字列のみが印刷されます。ただし、sh
テキストを実行する代わりに使用すると、bash
テキストの色が変わります。これがなぜそれを理解するのに役立つ人がいますか?
また、単一引用符の代わりに二重引用符を使用してテストしましたが、使用した場合にのみ機能するようですsh
。以下に例を掲載します。
私が使用するスクリプトとコードは次のとおりです。
#!/bin/bash
red=$'\033[1;31m'
nc=$'\033[0m'
echo "${red}Test 1$nc"
echo ""
##########################
red=$"\033[1;31m"
nc=$"\033[0m"
echo "${red}Test 2$nc"
echo ""
##########################
red='\033[1;31m'
nc='\033[0m'
echo "${red}Test 3$nc"
echo ""
##########################
red="\033[1;31m"
nc="\033[0m"
echo "${red}Test 4$nc"
echo ""
bashとshを使ってmacOSから出力する:
Linuxでbashとshの両方を使用した結果:
答え1
ここで最も重要なのは、端末が制御シーケンスを認識するには、端末に送信された出力にESC文字を含める必要があり、[1;31m
ESCは制御文字であり、通常はシェルスクリプトにあるように表示しないことです。ただし、\033
8進数文字コード(10進数27、8進数033、または16進数0x1b)を使用して文字を表すには、バックスラッシュエスケープ文字を使用します。 )。残りはちょうど普通のキャラクターです。
バックスラッシュエスケープ文字は、ある時点で元のESC文字に変更する必要があります。これには2つの場所があります。変数への割り当てとそれを印刷するコマンドです。
これをサポートするシェルでは、$'...'
引用符タイプはすでにエスケープを記述しているため、以降のred=$'\033[...'
変数自体には元のESC文字が含まれます。これは標準のPOSIX機能ではなく、これをサポートしていないシェルでは、生のドル記号を割り当ててからバックスラッシュなどを割り当てます033[
。一方、 red='\033[...'
バックスラッシュ033[
などは割り当てのみとなり、エスケープは解釈されません。バラより
($"..."
および"..."
エスケープは解釈されるべきではなく、ドル記号のあるエスケープも非標準なので、サポートしていないシェルに文字通りドル記号を残すことができます。)
次に、第2のステップは印刷である。バックスラッシュエスケープは一部のシェルでecho
拡張されます。それ以外の場合はそうではありません。それらのいくつかecho -e
も同じです。 Bashはecho
デフォルトではこれを行いませんが、設定を使用するとxpg_echo
...実行されます。 Zshはecho
これを解釈します。バラより
したがって、在庫Linuxデスクトップディストリビューションの在庫Bashでxpg_echo
whereが設定されていない場合、ジョブにred=$'\033[1;31m'; echo "${red}text"
ESCが生成され、赤いテキストが印刷されますが、ジョブまたはred='\033[1;31m'; echo "${red}text"
では生成されず、通常印刷されecho
ます。\033[1;31mtext
絵の具。
Debian / Ubuntuはsh
Dashですが、$'...'
引用符はサポートしていませんが、echo
バックスラッシュは解釈されるため、 red=$'\033[1;31m'; echo "${red}text"
通常の色が印刷され、赤い$
テキストが印刷されます。これはLinuxを実行したsh
ときの様子です。一部の他のLinuxシステムでは、異なる結果が得られます。
Macにインストールされているシェルは、sh
実際に設定されたBash(インストール時に無効になったシェルxpg_echo
)または最新のmacOSバージョンのzshです。 POSIXと互換性を持たせようとするbash
最初の試みにもかかわらずsh
彼らはまだ支持するquote$'...'
なので、両方とも赤いテキストをred=$'\033[1;31m'; echo "${red}text"
印刷しますred='\033[1;31m'; echo "${red}text"
。
まだ混乱していますか?red='\033[1;31m'; printf "%b\n" "${red}text";
すべてのPOSIX様シェルで動作する必要があります。引数でバックスラッシュエスケープを処理するように指示する%b
と、「テキスト」のすべての内容が処理されます。
答え2
Linux 私は答えることができます。コアは、ANSIエスケープシーケンスを使用するのではなく、変数を宣言する方法だと思います。
red=$'\033[1;31m' # a dollar sign and an ANSI escape sequence
red=$"\033[1;31m" # a dollar sign and an ANSI escape sequence
red='\033[1;31m' # only an ANSI escape sequence
red="\033[1;31m" # only an ANSI escape sequence
でsh
印刷するとき
echo "${red}some text"
変数の値を印刷red
し、いくつかのテキストを印刷します。最初の2つのケースでは、ANSIエスケープシーケンスの前にドル記号があるため、色の変更の影響を受けません。
でbash
印刷するとき
echo -e "${red}some text"
ANSIエスケープシーケンスは解釈されますが、
echo "${red}some text"
ANSIエスケープシーケンスは解釈されませんが、文字は文字通り印刷されますが、ステートメントの前に変換を実行できますecho
。
オプションなしでANSIエスケープシーケンスを解釈できるsh
別の組み込み関数があります。echo
-e
bash
最初の例と他の例の違いは、16進値を見ると分かりますred
。私が編集したスクリプトをチェックしてください。
#!/bin/bash
red=$'\033[1;31m'
nc=$'\033[0m'
hexdump <<< "$red"
echo $1 "${red}Test 1$nc"
echo ""
##########################
red=$"\033[1;31m"
nc=$"\033[0m"
hexdump <<< "$red"
echo $1 "${red}Test 2$nc"
echo ""
##########################
red='\033[1;31m'
nc='\033[0m'
hexdump <<< "$red"
echo $1 "${red}Test 3$nc"
echo ""
##########################
red="\033[1;31m"
nc="\033[0m"
hexdump <<< "$red"
echo $1 "${red}Test 4$nc"
echo ""
echo -e
また、これらのオプションをスクリプトに追加して見やすくしたので、両方を試してみてください。
bash box2
そして
bash box2 -e
たとえば、ドル記号なしで「coloring」変数を宣言することをお勧めします。
red='\033[1;31m'
ドル記号を使用する場合のみ使用たとえば、echo
問い合わせ変数です。