$'...'、$"..."、"..."、および"..."を使用したテキストの色

$'...'、$

私が覚えている限り、私は個人的に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;31mESCは制御文字であり、通常はシェルスクリプトにあるように表示しないことです。ただし、\0338進数文字コード(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_echowhereが設定されていない場合、ジョブにred=$'\033[1;31m'; echo "${red}text"ESCが生成され、赤いテキストが印刷されますが、ジョブまたはred='\033[1;31m'; echo "${red}text"では生成されず、通常印刷されechoます。\033[1;31mtext絵の具。

Debian / UbuntuはshDashですが、$'...'引用符はサポートしていませんが、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と、「テキスト」のすべての内容が処理されます。

おすすめ記事