2008-11-26 23 views
11

Estoy usando GNU bash, versión 3.00.15 (1) -release (x86_64-redhat-linux-gnu). Y este comando:echo "-e" no imprime nada

echo "-e" 

no imprime nada. Supongo que esto se debe a que "-e" es una de las opciones válidas del comando echo porque echo "-n" y echo "-E" (las otras dos opciones) también producen cadenas vacías.

La pregunta es cómo escapar de la secuencia "-e" del eco para obtener la salida natural ("-e").

Respuesta

12

Este es un duro uno;)

lo general, se podría usar guiones dobles para decirle al comando que debería dejar de opciones de interpretación , pero echo solamente dará salida a los que:

$ echo -- -e 
-- -e 

puede usar -e sí para evitar el problema:

$ echo -e '\055e' 
-e 

También, como otros han señalado, si no insiste en usar la fiesta builtin echo, su /bin/echo binario podría ser la versión GNU de la herramienta (compruebe la página del manual) y así comprender la variable de entorno POSIXLY_CORRECT :

$ POSIXLY_CORRECT=1 /bin/echo -e 
-e 
+0

¿Por casualidad saber, ¿por qué 'eco -e' hace no funciona desde Makefiles? –

+2

@dma_k: funciona para mí (tm). make (1) no usa el shell $ SHELL que está utilizando, por lo que se comportará de manera diferente. – hop

+0

¡Gracias, genial! De hecho, establecer 'SHELL =/bin/bash' en Makefile resolvió el problema. –

4

Usted puede engañar al hacer

echo "-e " 

Ese sería el tablero, e, espacio.

Alternativamente, puede utilizar la más compleja, pero más preciso:

echo -e \\\\x2De 
5

puede haber una mejor manera, pero esto funciona:

printf -- "-e\n" 
+0

En este caso, funciona pero no resuelve el problema global. Considere: printf "--version" – wheleph

+2

@wheleph Ha ignorado el signo "-" antes de "-e \ n". Esto separa las opciones de los argumentos. Esta es la mejor y más portable respuesta (across shells). +1. – richq

+0

@rq Sí, lo he echado de menos. 1 – wheleph

1
 
[[email protected] mail]# POSIXLY_CORRECT=1; export POSIXLY_CORRECT 
[[email protected] mail]# /bin/echo "-e" 
-e 
[[email protected] mail]# 
+0

Solo 'POSIXLY_CORRECT = 1/bin/echo -e' (sin los 's) es suficiente. Aunque esto no utiliza la versión BASH de echo –

+0

Información sobre el modo POSIX de Bash: http://www.network-theory.co.uk/docs/bashref/BashPOSIXMode.html. El elemento 41 se dirige al comando echo. La única pregunta que me queda es por qué [root @ scintia mail] # POSIXLY_CORRECT = 1; exportar POSIXLY_CORRECT; echo "-e"; no funciona – wheleph

+0

Vinko, '/ bin/echo -e' también es suficiente :) – wheleph

0

Otra forma:

echo -e' ' 
echo -e " \b-e" 
+0

aunque produce más que simplemente "-e" debajo del capó :) –

1

Después prestando especial atención a la página del manual :)

SYSV3=1 /usr/bin/echo -e 

obras, en Solaris al menos

+0

No he encontrado ninguna referencia a la variable de env SYSV3 en Página del generador de eco de Linux – wheleph

+0

Parece que el env de POSIXLY_CORRECT de otra respuesta es el equivalente? –

-2
/bin/echo -e 

obras, pero ¿por qué?

[[email protected] ~]$ which echo 
/bin/echo 
+2

Si escribe "echo -e" usa el eco interno bash, y escribir "/ bin/echo -e" usa el comando externo/bin/echo. Pero en mi caja Ubuntu 8.04 ninguna de las dos versiones funciona .. –

+2

'which' te dirá qué binario se usará, pero no dirá si tu shell tiene una función incorporada del mismo nombre (que probablemente se use en lugar del binario). Puede usar 'type' en lugar de' which' para obtener más información. – dreamlax

1

Otra alternativa:

echo x-e | sed 's/^x//' 

Ésta es la forma recomendada por el autoconf manual:

[...] A menudo es posible evitar este problema utilizando 'eco "x $ palabra "', tomando la' x 'en cuenta más adelante en el tubo.

14

La única verdadera manera de imprimir cualquier cadena arbitraria:

printf "%s" "$vars" 
+0

+1 La mejor respuesta. – helpermethod

+0

¿No sería agradable? Pero esto no funcionará para las secuencias de escape ANSI integradas, y depende de a quién se le asignó el valor. Pruebe 'v =" $ (tput sgr0) "; printf "% s" "$ v" 'o' v = $ (printf '\ 033 [4m'); printf "% s" "$ v" 'etc. –

+0

@AndreasSpindler, si desea '% b' en lugar de'% s' ... bueno, está disponible en todas las implementaciones POSIX printf, y eso le da el mismo manejo de secuencia de escape que se encuentra en 'echo'. –

1

me gusta que uno usando un herestring:

cat <<<"-e"