Wenn ich versuche, farbigen Text mit ANSI-Escape-Sequenzen über den eingebauten echo
Befehl auszudrucken , wird die \e
Escape-Sequenz in der von mir angegebenen Zeichenfolge buchstäblich interpretiert und nicht als "Escape", das sie darstellen soll. Dies geschieht nur in Snow Leopard - die folgenden Beispiele funktionieren in Leopard wie beabsichtigt.
Anscheinend echo
unterstützt der -e
Schalter, da er \n
bei der Verwendung korrekt interpretiert wird:
~ $
~ $ echo "\n"
\n
~ $ echo -e "\n"
~ $
Aber wenn ich versuche zu benutzen \e
, bekomme ich folgendes:
~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $
Wie ich bereits sagte, würde mir in Leopard der obige String die Farbe "COLORS" geben.
Kennt jemand einen Grund, warum dies eine beabsichtigte Änderung sein könnte? Wie wäre es mit einer Problemumgehung für das Drucken von ANSI-Escape-Sequenzen aus Bash-Skripten auf Snow Leopard?
Die Bash-Shell-Version auf meinem Leopard-Computer ist 3.2.17(1)-release
und 3.2.48(1)-release
auf meinem Snow Leopard-Computer.
quelle
Antworten:
Ich kann Ihnen nicht sagen, warum es dieses Argument nicht unterstützt (Sie müssen möglicherweise die Programmierer danach fragen). Ich weiß nur, dass ich auf meiner Linux-Box Folgendes bekomme:
\e
Fluchten/bin/echo
von Gnu Coreutils ist. Wenn Apple die Quelle seiner Unix-Systemkomponenten von Zeit zu Zeit ändert (z. B. von zsh nach bash), prüfen Sie, ob/bin/echo
zwischen Leopard und Snow Leopard eine Änderung stattgefunden hat. Wenn es Gnu ist, können Sie die Leute bei gnu.org fragen, warum sie sich dafür entscheiden, diese Sequenzen nicht einzuschließen.Problemumgehungen (das ist interessanter): Nicht mit
/bin/echo
, aber Bashs Builtinecho
funktioniert auf Linux-Boxen. Wenn sie in eine Bash ohne eingebautes Echo (oder etwas noch Dunkleres) geändert wurden, können Sie auch diese nicht weit verbreitete Funktion Ihrer Shell ausprobieren (funktioniert zumindest in Bash und Zsh):Dies ist der passende Teil der bash-Manpage:
quelle
$'string'
die Fluchtsequenz aktiviert ist, danke.\e
ist nicht Teil des POSIX-Standards; Die Implementierung von GNU Coreutils hat den Standard erweitert. OS X nicht.Versuchen Sie es
\x1B
statt\e
.quelle
\x1B
statt\e
funktioniert, danke.1B
dient der Hex-Wert des Escape-Zeichens .Funktioniert
\033
noch Wenn nicht, können Sie hoffentlich Strg + V drücken, gefolgt von der Escape-Taste (wenn ein Mac diese Tasten hat), um ein echtes Steuerzeichen in der Befehlszeile zu erstellen (was in Skripten natürlich nicht so gut funktioniert, je nach Editor).quelle
\033
statt\e
funktioniert, danke.33
dient der Oktalwert des Escape-Zeichens .033
wäre eine standardisierte Schreibweise oktal.Eine andere Möglichkeit zum Drucken von ANSI-Escape-Sequenzen in der Shell ist die Verwendung von
/usr/bin/printf
.quelle
Ergänzen Sie die vorhandene hilfreiche Antwort mit Hintergrundinformationen :
Wenn Sie nur mit dem Namen aufrufen
echo
- und nicht mit dem Pfad/bin/echo
- , rufen Sie die integrierte Bash- Funktion auf und nicht das externe Dienstprogramm auf.Das Verhalten von systemeigenen Bash-Elementen, wie z. B. integrierten Elementen, ist in der Regel im Bash-Sinne portierbar. Dies bedeutet, dass sie auf allen Plattformen, auf denen Bash ausgeführt werden kann, gleich funktionieren sollten .
\e
ist eine merkwürdige Ausnahme, die 3.x Bash-Versionen unter macOS betrifft betrifft (aus rechtlichen Gründen enthält macOS seit Version 10.13.5 (High Sierra) veraltete 3.x-Versionen von Bash).\e
(und sein Alias\E
) sollte funktionieren mitecho -e
;\e
Unterstützung wurde demecho
eingebauten in Bash 2.0 hinzugefügt . , aber aus unerklärlichen Gründen nicht in der 3.x-Version auf macOS.\e
tut in 3.x Bash-Versionen auf anderen Plattformen wie MSYS unter Windows.Umgekehrt funktioniert es , wenn Sie einen 4.x Bash unter macOS installieren und verwenden .
\e
quelle
Sie könnten versuchen, sich an POSIX anzupassen: http://www.opengroup.org/onlinepubs/9699919799/
Teil OPTIONEN besagt unter anderem:
quelle
-e
.Zu Ihrer Information, wir sind gerade dabei, \ e Unterstützung für / bin / echo und / usr / bin / printf in coreutils hinzuzufügen. Beachten Sie, dass die C-Standards nicht \ e angeben, aber gcc, perl, bash, ksh und tcsh dies unterstützen
quelle
Sie können überprüfen, ob im Menü "Ansichtsoptionen" der terminal.app die Option "Nicht-ASCII-Zeichen entziehen" deaktiviert wurde.
quelle