web-dev-qa-db-ja.com

MacOSXで-e引数を使用すると、エコーサポート "\ e"(エスケープ)が表示されないのはなぜですか

組み込みの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です。

36
hasseg

なぜそれがその議論をサポートしないのか、私はあなたに言うことができません(プログラマーにそれについて尋ねなければならないかもしれません)。私の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エスケープについて言及していません
  • それはgnu coreutilsからの/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.
25
0x89

\x1Bではなく\eをお試しください。

49
LiraNuna

します\033まだ機能しますか?そうでない場合は、うまくいけば、Ctrl + Vに続いてEscapeキー(Macにそれらのキーがある場合)を押して、コマンドライン内に実際の制御文字を作成できます(もちろん、エディターによっては、スクリプトではうまく機能しません)。

15
mihi

シェルでANSIエスケープシーケンスを出力するもう1つの方法は、 /usr/bin/printf

11
hasseg

既存の有用な回答をいくつかの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機能します。

6
mklement0

参考までに、coreutilsの/ bin/echoおよび/ usr/bin/printfに\ eサポートを追加しようとしています。 C標準は\ eを指定していませんが、gcc、Perl、bash、ksh、tcshはそれをサポートしています。

2
pixelbeat

彼らはPOSIXに準拠しようとするかもしれません: http://www.opengroup.org/onlinepubs/9699919799/

パートOPTIONSは、とりわけ次のように述べています。

Implementations shall not support any options.
2
Caotic

Terminal.appの表示オプションメニューで「, ASCII以外の文字をエスケープする」がオフになっているかどうかを確認できます。