2010-12-14 12 views
23

He leído las páginas man en echo, y me dice que el parámetro -e permitirá que un carácter escapado, como un n escapado para nueva línea, tenga un significado especial. Cuando escribo el comandoecho outputs -e parámetro en scripts bash. ¿Cómo puedo prevenir esto?

$ echo -e 'foo\nbar' 

en un shell bash interactiva, consigo el resultado esperado:

foo 
bar 

Pero cuando se utiliza este mismo comando (He probado este carácter de comando para el personaje como una caso de prueba) me sale el siguiente resultado:

-e foo 
bar 

es como si el eco está interpretting la -e como parámetro (debido a que la nueva línea todavía aparece) pero también interpreta el -e como una cadena de la CEE Ho. ¿Que está pasando aqui? ¿Cómo puedo evitar que aparezca -e?

+0

Estoy corriendo Ubuntu Lucid 10.04 en caso de que esto es importante –

+0

que se hacen eco está usando? escribe 'which echo' en la línea de comando. –

+0

Resulta que estaba usando la versión 'Bourne Shell' en mis scripts, pero la versión Bash en la versión interactiva. –

Respuesta

28

Necesita usar #!/bin/bash como primera línea en su secuencia de comandos. Si no lo hace, o si usa #!/bin/sh, la secuencia de comandos será ejecutada por el shell Bourne y su echo no reconoce la opción -e. En general, se recomienda que todas las secuencias de comandos nuevas usen printf en lugar de echo si la portabilidad es importante.

En Ubuntu, sh es proporcionado por un enlace simbólico al /bin/dash.

+0

Oh, eso es todo. Tuve! #/Bin/sh, que obviamente estaba ejecutándose en Bourne, pero mi shell interactivo era Bash. Aclamaciones. –

+0

+1. Guardado mis registros de cierta fealdad incluso 7 meses después – Vlueboy

+0

cómo resolver el mismo problema en Python? Me gustaría imprimir os.system ("echo -e '\ x41'") pero está teniendo el mismo problema –

3

Las diferentes implementaciones de echo se comportan de maneras molestamente diferentes. Algunos no toman opciones (es decir, simplemente harán eco de -e como usted describe) e interpretan automáticamente las secuencias de escape en sus parámetros. Algunos toman banderas y no interpretan escapes a menos que se les dé el indicador -e. Algunos toman banderas e interpretan diferentes secuencias de escape dependiendo de si se pasó la bandera -e. Algunos harán que te rasgues el pelo si tratas de que se comporten de una manera predecible ... oh, espera, eso es todo.

Lo que probablemente esté viendo aquí es una diferencia entre la versión de echo integrada en bash frente a /bin/echo o quizás en comparación con alguna otra shell incorporada. Esto me mordió cuando Mac OS X v10.5 incluía un bash builtin echo que hacía eco de indicadores, a diferencia de lo que esperaban todos mis scripts ...

En cualquier caso, hay una solución: use printf en su lugar. Siempre interpreta secuencias de escape en su primer argumento (la cadena de formato). Los problemas son que no agrega automáticamente una nueva línea (por lo que debe recordarlo explícitamente), y también interpreta las secuencias % en su primer argumento (después de todo, es una cadena de formato). En general, quiere poner todo el material de formato en la cadena de formato, luego coloque cadenas variables en el resto de los argumentos para que pueda controlar cómo se interpretan según qué formato % use para interpolarlos en el resultado. Algunos ejemplos:

printf "foo\nbar\n"  # this does what you're trying to do in the example 
printf "%s\n" "$var"  # behaves like 'echo "$var"', except escapes will never be interpreted 
printf "%b\n" "$var"  # behaves like 'echo "$var"', except escapes will always be interpreted 
printf "%b\n" "foo\nbar" # also does your example 
+0

Genial, gracias por los detalles. Soy bastante aficionado a printf en C, así que debería ser un complemento. –

1

Uso

alias eco/usr/bin/echo

para forzar 'echo' invocar eco que interpretar 'coreutils parámetro -e'.

Cuestiones relacionadas