Cuando intento imprimir un texto en color usando secuencias de escape ANSI a través del echo
comando incorporado , parece que la \e
secuencia de escape en la cadena que proporciono se interpreta literalmente en lugar de como el "escape" que se supone que representa. Esto solo sucede en Snow Leopard: los ejemplos a continuación funcionan según lo previsto en Leopard.
Aparentemente echo
es compatible con el -e
interruptor, ya que se interpreta correctamente \n
al usarlo:
~ $
~ $ echo "\n"
\n
~ $ echo -e "\n"
~ $
Pero cuando trato de usar \e
, obtengo esto:
~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $
Como dije, en Leopard, lo anterior me daría el hilo "COLORES" en color.
¿Alguien sabe de una razón por la que esto podría ser un cambio previsto? ¿Qué tal una solución alternativa para imprimir secuencias de escape ANSI de scripts Bash en Snow Leopard?
La versión de shell Bash en mi máquina Leopard es 3.2.17(1)-release
y 3.2.48(1)-release
en mi máquina Snow Leopard.
fuente
Respuestas:
No puedo decirte por qué no admite ese argumento (es posible que tengas que preguntarle a los programadores sobre eso). Solo sé que en mi caja de Linux, obtengo esto:
\e
escapes/bin/echo
de gnu coreutils. A medida que Apple cambia la fuente de sus componentes del sistema Unix de vez en cuando (por ejemplo, pasar de zsh a bash), verifique si hubo un cambio/bin/echo
entre Leopard y Snow Leopard. Si es gnu, puede preguntar a las personas en gnu.org por qué eligen no incluir esas secuencias.En cuanto a las soluciones (eso es más interesante): no se usa
/bin/echo
, pero bash incorporadoecho
funciona en cajas de Linux. Si cambiaron a bash sin eco incorporado (o algo aún más oscuro), también podría probar esta característica no muy conocida de su shell (funciona al menos en bash y zsh):Esta es la parte correspondiente de la página de manual de bash:
fuente
$'string'
secuencia de escape habilitada, gracias.\e
no es parte del estándar POSIX; la implementación de GNU coreutils extendida en el estándar. OS X no lo hizo.Intenta en
\x1B
lugar de\e
.fuente
\x1B
en lugar de\e
funciona, gracias.1B
es el valor hexadecimal del personaje Escape .¿
\033
Aún funciona? Si no, puede presionar Ctrl + V seguido de la tecla Escape (si un mac tiene esas teclas) para crear un carácter de control real dentro de la línea de comando (que no funciona tan bien en los scripts, por supuesto, dependiendo del editor)fuente
\033
en lugar de\e
funciona, gracias.33
es el valor octal del carácter Escape .033
sería una forma estandarizada de escribir octal.Otra forma de imprimir secuencias de escape ANSI en el shell es mediante el uso
/usr/bin/printf
.fuente
Para complementar la útil respuesta existente con alguna información de fondo :
Si eres invocación
echo
por nombre solamente - en lugar de con su ruta,/bin/echo
- que está invocando el Bash incorporado en lugar de la utilidad externa.El comportamiento de los elementos nativos de Bash, como los incorporados, generalmente es portátil en un sentido de Bash, lo que significa que deberían funcionar igual en cualquier plataforma capaz de ejecutar Bash .
\e
es una curiosa excepción que afecta a las versiones 3.x Bash en macOS (hasta el día de hoy, a partir de v10.13.5 (High Sierra), macOS viene con versiones desactualizadas 3.x de Bash, por razones legales).\e
(y su alias\E
) deberían funcionar conecho -e
;\e
Se agregó soporte a la versiónecho
integrada en Bash 2.0 . , pero inexplicablemente no lo hace en la versión 3.x en macOS.\e
hace el trabajo en 3.x versiones Bash en otras plataformas, como MSYS en Windows.Por el contrario, si se instala y utiliza un 4.x Bash en MacOS,
\e
hace el trabajo.fuente
Pueden tratar de cumplir con POSIX: http://www.opengroup.org/onlinepubs/9699919799/
OPCIONES de parte establece entre otras cosas:
fuente
-e
.Para su información, estamos a punto de agregar \ e soporte a / bin / echo y / usr / bin / printf en coreutils. Tenga en cuenta que los estándares C no especifican \ e, pero gcc, perl, bash, ksh y tcsh lo admiten
fuente
Puede verificar si ,, caracteres de escape que no son ascii '' no han sido marcados en el menú de opciones de visualización de la terminal.app.
fuente