MacOSXで-e引数を使用するときに「\ e」(エスケープ)をサポートしないのはなぜですか


36

組み込み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シェルのバージョンがある3.2.17(1)-release3.2.48(1)-release私のSnow Leopardのマシン上で。


1
この質問は投稿と矛盾しています。質問では/ bin / echoを参照しますが、投稿ではパスなしのエコーを使用します。これはおそらくシェルの組み込みエコーです。
0x89

もちろん、気づいてくれてありがとう。これを反映して質問を修正しました。
ハッセグ

回答:


24

なぜその引数をサポートしていないのかを説明することはできません(プログラマーにそれについて尋ねる必要があるかもしれません)。私が知っているのは、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 bug-coreutils@gnu.org
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/echognu coreutilsからのものだと言っています。アップルがUnixシステムコンポーネントのソースを時々変更する(たとえば、zshからbashに移動する)ときに/bin/echo、LeopardとSnow Leopardの間で変更があったかどうかを確認します。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.

4
$'string'エスケープシーケンス対応であることを知りませんでした、ありがとう。
ハッセグ

1
\ePOSIX標準の一部ではありません。GNU coreutils実装が標準に拡張されました。OS Xはしませんでした。
マルタインピータース


15

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


5
\033動作する代わりに\e、感謝します。
ハッセグ

4
参考のため33に、エスケープ文字の 8進数値を示します
TachyonVortex

読者の参考のために、8進数を記述する標準化された方法に033なるでしょう。
オコド

11

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


3
printfは、シェルで物事を表示するポータブルな方法です。エコーの、あまりにも多くのフレーバーがあります...
mouviciel

6

既存の有用な回答を背景情報で補完するには:

あなたのしている場合、呼び出しechoによって名前のみ -そのパスとは対照的に、/bin/echo- あなたはバッシュの起動している組み込みのではなく、外部のユーティリティを。

ビルトインなどのネイティブBash要素の動作は、通常Bashの意味で移植性があります。つまり、Bash を実行できるすべてのプラットフォームで同じように動作するはずです。

\eは、macOS上の3.x Bashバージョンに影響する奇妙な例外です(今日まで、v10.13.5(High Sierra)の時点で、macOSには法律上の理由で古い3.xバージョンのBashが付属しています)。

\e(およびそのエイリアス\E動作するはずecho -eです; Bash 2.0\eecho組み込みにサポートが追加されました。、しかし不可解なことに、macOSの3.xストックバージョンにはありません。

\e で3.xのBashのバージョンで作業を他のそのようなWindows上でMSYSなどのプラットフォーム、。

逆に、macOSに4.x Bashをインストールして使用する場合\e 機能します。


2

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

パートOPTIONSには、特に以下が記載されています。

Implementations shall not support any options.

ここに、私があなたが意図したと思う資料への直接リンクがあります:opengroup.org/onlinepubs/9699919799/utilities/echo.html
通知があるまで一時停止します。

いや。ページは引き続き書き込みます。「最初のオペランドが-nの場合、またはいずれかのオペランドに<バックスラッシュ>文字が含まれている場合、結果は実装定義です。」また、macOSエコーはを解釈し-eます。
ヨンウェイ・ウ

2

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.