echo -e \e は、macOS で bash スクリプトのエスケープ情報を印刷しません。

echo -e \e は、macOS で bash スクリプトのエスケープ情報を印刷しません。

ちょうどMacに移動しました。で使用していますbash。スクリプト自体は機能しますが、カラー出力を生成するように書かれて破損しています。

以下はスクリプトの最初の2行です。

#!/bin/bash

echo -e -n "\e[0m\e[32mhks>>>\e[2m "
  • 私の期待は、これを実行すると明るい緑色のzsh出力が生成されることです。hks>>>
  • ただし、生成された出力は次のようになります。
    matthiashuttar@mac hks % hks bla
    \e[0m\e[32mhks>>>\e[2m \e[91mfailed to resolve target\e[0m
    

ステートメントをzshそのまま実行でき、正しい緑色の出力が生成されるので、これが問題にならないことがわかります。echozsh

誰かが私が逃したことを指摘できますか?

答え1

MacOSには以前のバージョンのbash(3.2.x)が付属しているため、他のシステムで実行されているbashスクリプトはmacOSで実行されない可能性があります。 macOSのbashバージョン\eecho

これはbash 1.xから3.xまでのバグであるように見え、4.0で修正されました。マニュアルには、\eサポートされているエスケープシーケンスの1つとしてリストされていますが、両方ともリストされており、echoサポートhelp echoされてい\Eません\e。 (コードを詳しく見てもわかりませんが、別々に処理されますが、\e実験\Eではそうです。)

(不一致によるバグがあったはずですが、\E当時はサポート専用が望ましい動作だったと思います。おそらく非標準拡張であり、シェルサークルには主にコマンドラインオプションで次のような習慣があったからでしょう。小文字は標準であり大文字は非標準または最新の追加のため、マニュアルに誤って記載されているというエラーがあります\e

printf$'…'バックスラッシュエスケープには別のコードを使用します。これはbash \e3.2.xでも認識されます。あるいは、すべてのshスタイルシェルで動作する8進エスケープシーケンスを使用できます。

したがって、次のいずれかに置き換えることができますecho -e -n '\e…'

  • echo -e -n '\033…'(ほとんどのshスタイルシェルで動作しますが、一部はサポートしていないか、-eオプション-nとして)
  • printf '\033…'(任意の値%を2倍にする必要があります。%s変数がある場合は追加の引数が使用されます。)(すべてのshスタイルシェルに適用されます)
  • printf %b '\033…'(すべてのshスタイルシェルに適用)
  • printf '\e…'(任意の値%を2倍にする必要があります。%s変数がある場合は、追加の引数を使用してください。)
  • printf %b '\e…'
  • echo -n $'\e…'
  • echo -n -e '\E…'

関連情報