LinuxとSolarisで実行する必要があるkshスクリプトがあります。特定のコマンドの出力に色を付けようとしています。 Linux(特にRHEL6)では機能しますが、Solaris(SunOS 5.10)では機能しません。
Linuxのコマンド(出力「test」が赤で正しく表示されます):
[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test
Solarisのコマンド(出力「test」は色付けされていません):
[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m
出力に元のコードなしで出力が赤になるようにこのコマンドを作成する方法はありますか? "echo" コマンドは実際に実行するコマンドのパディングだけなので変更できません。
答え1
\xNN
GNU sedのエスケープシーケンスですが、標準ではなく、特にSolarisでは使用できません。
スクリプトにリテラルエスケープ文字を含めることができますが、これを行うと読みやすく編集が難しくなります。
printf
これを使用してエスケープ文字を生成できます。 16進ではなく8進エスケープを理解します。
esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"
電話してもいいtput
sed 呼び出しで代替テキストを生成します。このコマンドはエスケープシーケンスを探します。用語情報データベース。理論的には、tput
スクリプトの移植性を向上させますが、実際には使用しない端末を実行する可能性を減らします。ANSIエスケープコード。
echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"
答え2
ご利用いただくとさらに便利になりますtput
tput setaf 1; somecommand; tput sgr0
または
tput setaf 1
somecommand
tput sgr0
前景を赤に設定し、somecommand
実行後に出力を赤で表示し、色の順序を消去します。これは少なくともbash
、およびzsh
に適用されますksh
。
で何ができるかをtmux(1)
学びましょう。terminfo(5)
tput
答え3
より簡単な方法もあります:
エスケープ文字に対応するバイトを正確に確認するには、\033
次の手順を実行します。
printf "\033" | xxd -p
あなたは得る
1b
したがって、エスケープシーケンス\ 033は、2進バイト0b00011011、10進バイト27、または16進バイト1bに対応します。
良いニュース:sedは16進コードを知っています!
echo "color test" | sed 's,color,\x1b[31m&\x1b[0m,'
これは16進数を知るときのより良い解決策です。
答え4
一部の端末(itermのbashなど)では、「ctrl-v」を押してから「ctrl + [」を押して、リテラルエスケープ文字を入力文字列に入れることができます。操作すると、画面に「^ [」文字が表示されることがありますが、その周りにカーソルを移動すると、実際にはステージの後ろにあるため、1つの文字として扱われます。
何が起こっているのかを確認し、これがうまくいくかどうかをテストするには、ctrl + vと入力してからctrl + iと入力します。プロンプト文字列にタブ文字が挿入されていることがわかります。 CSの歴史はこれがなぜそうなのかを説明しています。しかし、実際に古いキーボードにはctrl + Iハードキーがあることがわかりました。熱狂タブ文字を送信します。 Tabキーも同じ電気信号を送信します。
このような従来の理由により、多くの端末 bash は依然として特定の Ctrl コードを解釈して同じ文字にマップします。
Ctrl + Iはタブ文字にマップされ、ctrl + [はASCIIエスケープ文字と正確に一致します。