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」コマンドを変更することはできません。これは、実際に実行しているコマンドの入力にすぎないためです。
\xNN
はGNU sedのエスケープシーケンスですが、標準ではありません。特にSolarisでは使用できません。
スクリプトにリテラルエスケープ文字を含めることができますが、その場合、読み取りや編集が難しくなります。
printf
を使用してエスケープ文字を生成できます。 16進数ではなく8進数のエスケープを理解します。
esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"
tput
を呼び出して、sedの呼び出しで置換テキストを生成できます。このコマンドは terminfo データベースでエスケープシーケンスを検索します。理論的には、tput
を使用するとスクリプトの移植性が向上しますが、実際には ANSIエスケープコード を使用しない端末に遭遇することはほとんどありません。
echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"
tput
を使用する方が簡単でしょう
_tput setaf 1; somecommand; tput sgr0
_
または
_tput setaf 1
somecommand
tput sgr0
_
これにより、フォアグラウンドが赤に設定され、somecommand
が実行されます。これにより、出力が赤で表示され、カラーシーケンスがクリアされます。これは少なくともbash
、zsh
およびksh
で機能します。
tput
でできることの詳細については、tmux(1)
およびterminfo(5)
を参照してください。
一部の端末(私用のitermのbashなど)では、キー「ctrl-v」に続けて「ctrl + [」を押すと、リテラルエスケープ文字が入力文字列に挿入されます。動作する場合は、画面に「^ [」という文字が表示されますが、カーソルをその周りに移動すると、実際には背後にあるため、1つの文字として扱われます。
何が起こっているのかを理解する(そして、これが可能かどうかをテストする)には、ctrl + vに続けてctrl + iを入力します。プロンプト文字列にタブ文字が挿入されているはずです。これが当てはまる理由については、CSの履歴があります。しかし、本当に古いキーボードには、タブ文字を送信するためのctrl + Iハード有線が困難であることがわかりました。タブキーも同じ電気信号を送信します。
その従来の理由により、多くの端末のbashは、特定のctrlコードを解釈して同じ文字にマップします。
Ctrl + Iはタブ文字にマップされ、ctrl + [はたまたまASCIIエスケープ文字に一致します。