variable bash echo

variable - echo genera el parámetro-e en los scripts de bash. ¿Cómo puedo prevenir esto?



echo shell linux (4)

Debe usar #!/bin/bash como la primera línea en su script. Si no lo hace, o si usa #!/bin/sh , el shell Bourne ejecutará el script y su echo no reconocerá la opción -e . En general, se recomienda que todos los nuevos scripts utilicen printf lugar de echo si la portabilidad es importante.

En Ubuntu, sh se proporciona mediante un enlace simbólico a /bin/dash .

He leído las páginas man en echo, y me dice que el parámetro -e permitirá que un personaje escapado, como una n escapada para nueva línea, tenga un significado especial. Cuando escribo el comando

$ echo -e ''foo/nbar''

en una shell bash interactiva, obtengo el resultado esperado:

foo bar

Pero cuando uso este mismo comando (he probado este carácter de comando para el carácter como un caso de prueba) obtengo el siguiente resultado:

-e foo bar

Es como si echo interpretara el -e como un parámetro (porque la nueva línea todavía aparece) pero también interpreta el -e como una cadena para hacer eco. ¿Que está pasando aqui? ¿Cómo puedo evitar que aparezca?


Diferentes implementaciones de echo comportan de maneras molestas diferentes. Algunos no toman opciones (es decir, simplemente harán eco de -e como usted describe) e interpretarán automáticamente las secuencias de escape en sus parámetros. Algunos toman banderas, y no interpretan escapes a menos que se les dé la bandera -e . Algunos toman banderas e interpretan diferentes secuencias de escape dependiendo de si se ha pasado la bandera -e . Algunos te harán arrancarte el pelo si intentas 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 vs /bin/echo o tal vez contra alguna otra shell integrada. Esto me mordió cuando Mac OS X v10.5 se distribuyó con un echo incorporado de bash que hacía eco de las banderas, a diferencia de lo que esperaban todos mis scripts ...

En cualquier caso, hay una solución: use printf lugar. Siempre interpreta las secuencias de escape en su primer argumento (la cadena de formato). El problema es que no agrega automáticamente una nueva línea (por lo que debe recordar hacerlo explícitamente), y también interpreta % secuencias en su primer argumento (es, después de todo, una cadena de formato). En general, desea colocar todas las cosas de formato en la cadena de formato, luego colocar cadenas variables en el resto de los argumentos para que pueda controlar cómo se interpretan mediante el formato % que utiliza para interpolarlos en la salida. 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



Utilizar

alias echo / usr / bin / echo

forzar ''echo'' invocando coreutils ''echo que interpreta'' -e ''parámetro.