組み込みのecho
コマンドを介してANSIエスケープシーケンスを使用して色付きのテキストを印刷しようとすると、指定した文字列の_\e
_エスケープシーケンスは、「エスケープ」を表すことになっています。これはSnow Leopardでのみ発生します-以下の例はLeopardで意図したとおりに機能します。
どうやらecho
は_-e
_スイッチをサポートしています。これは、使用時に_\n
_を正しく解釈するためです。
_~ $
~ $ echo "\n"
\n
~ $ echo -e "\n"
~ $
_
しかし、_\e
_を使用しようとすると、次のようになります。
_~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $
_
私が言ったように、Leopardでは、上記は "COLORS"という文字列を色で与えます。
これが意図された変更である理由を誰かが知っていますか? Snow LeopardのBashスクリプトからANSIエスケープシーケンスを印刷するための回避策はどうですか?
私のLeopardマシンのBash Shellバージョンは、Snow Leopardマシンでは3.2.17(1)-release
および3.2.48(1)-release
です。
なぜそれがその議論をサポートしないのか、私はあなたに言うことができません(プログラマーにそれについて尋ねなければならないかもしれません)。私のLinuxボックスでは、次のようになります。
$ /bin/echo --help
Usage: /bin/echo [SHORT-OPTION]... [STRING]...
or: /bin/echo LONG-OPTION
Echo the STRING(s) to standard output.
-n do not output the trailing newline
-e enable interpretation of backslash escapes
-E disable interpretation of backslash escapes (default)
--help display this help and exit
--version output version information and exit
If -e is in effect, the following sequences are recognized:
*emphasized text*
\0NNN the character whose ASCII code is NNN (octal)
\\ backslash
\a alert (BEL)
\b backspace
\c produce no further output
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
NOTE: your Shell may have its own version of echo, which usually supersedes
the version described here. Please refer to your Shell's documentation
for details about the options it supports.
Report echo bugs to [email protected]
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
Report echo translation bugs to <http://translationproject.org/team/>
\e
エスケープについて言及していません/bin/echo
であると述べています。 Appleは、UNIXシステムコンポーネントのソースを時々変更します(たとえば、zshからbashに移動)ので、LeopardとSnow Leopardの間で/bin/echo
の変更があったかどうかを確認します。それがgnuである場合、gnu.orgの人々に、なぜそれらのシーケンスを含めないことを選択するのかを尋ねることができます。回避策(より興味深い)の場合:/bin/echo
を使用しませんが、bashの組み込みecho
はLinuxボックスで動作します。エコーが組み込まれていないbashに変更された場合(またはさらに不明瞭な場合)、広く知られていないシェルの機能を試すこともできます(少なくともbashとzshで機能します)。
$ echo $'\e[34m''COLORS'
これは、bashのマンページの一致する部分です。
Words of the form $'string' are treated specially. The Word expands to string, with
backslash-escaped characters replaced as specified by the ANSI C standard. Backslash
escape sequences, if present, are decoded as follows:
\a alert (bell)
\b backspace
\e an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\' single quote
\nnn the eight-bit character whose value is the octal value nnn (one to three
digits)
\xHH the eight-bit character whose value is the hexadecimal value HH (one or
two hex digits)
\cx a control-x character
The expanded result is single-quoted, as if the dollar sign had not been present.
A double-quoted string preceded by a dollar sign ($) will cause the string to be trans‐
lated according to the current locale. If the current locale is C or POSIX, the dollar
sign is ignored. If the string is translated and replaced, the replacement is double-
quoted.
\x1B
ではなく\e
をお試しください。
します\033
まだ機能しますか?そうでない場合は、うまくいけば、Ctrl + Vに続いてEscapeキー(Macにそれらのキーがある場合)を押して、コマンドライン内に実際の制御文字を作成できます(もちろん、エディターによっては、スクリプトではうまく機能しません)。
シェルでANSIエスケープシーケンスを出力するもう1つの方法は、 /usr/bin/printf
。
既存の有用な回答をいくつかのbackground informationで補足するには:
invoke echo
bynameonly-パスではなく、/bin/echo
-bashを呼び出している場合外部ユーティリティではなく、組み込み。
ビルトインなどのネイティブBash要素の動作は、通常Bashの意味で移植可能です。つまり、Bashを実行できるすべてのプラットフォームで同じように動作するはずです。
\e
は、macOSの3.x Bashバージョンに影響する奇妙な例外です(今日まで、v10.13.5(High Sierra)の時点で、macOSには古い3.xバージョンが付属しています)法的な理由により、バッシュの)。
\e
(およびそのエイリアス\E
)はで動作しますecho -e
;\e
サポートがecho
ビルトイン Bash 2. 。に追加されましたが、macOSの3.xストックバージョンには説明がありません。
\e
はを3.x Bashバージョンでその他のプラットフォーム(Windows上のMSYSなど)で動作させます。
逆に、macOSに4.x Bashをインストールして使用する場合、\e
は機能します。
参考までに、coreutilsの/ bin/echoおよび/ usr/bin/printfに\ eサポートを追加しようとしています。 C標準は\ eを指定していませんが、gcc、Perl、bash、ksh、tcshはそれをサポートしています。
彼らはPOSIXに準拠しようとするかもしれません: http://www.opengroup.org/onlinepubs/9699919799/
パートOPTIONSは、とりわけ次のように述べています。
Implementations shall not support any options.
Terminal.appの表示オプションメニューで「, ASCII以外の文字をエスケープする」がオフになっているかどうかを確認できます。