Diferencia entre echo -e “<string>” y echo $ “<string>”


20

¿Cuál es la diferencia entre usar

echo -e "Hello\nWorld" 

y

echo $"Hello\nWorld" 

¿No salen ambos?

Hello
World

1
¿Lo intentaste? El segundo sale Hello\nWorld. Necesita el -einterruptor para interpretar los caracteres de escape.
becko

44
Para el segundo, sospecho que querías escribirlo con comillas simples echo $'Hello\nWorld', que se imprimirán en dos líneas debajo de bash.
John1024

@becko, sí, lo probé y ambos generan exactamente lo mismo
Mark

Respuestas:


33

echo -ey echo $'...'son similares en el sentido de que admiten las siguientes secuencias de escape:

  \a     alert (bell)
  \b     backspace
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
  \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
  \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
  \UHHHHHHHH
         the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

Ellos tienen diferencias. Además de lo anterior, echo -eadmite:

  \c     suppress further output
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)

Por el contrario, $'....'admite:

 \'     single quote
 \"     double quote
 \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
 \cx    a control-x character

Observe que, entre los dos, las \cextensiones son incompatibles:

$ echo -e  'start\n\cIstop'
start
$ echo  $'start\n\cIstop'
start
        stop

Para lo echo -eanterior, \csuprime la salida adicional, ignorando así Istop. Por el contrario, para $'...', el \cIse interpreta como una pestaña.

La forma visualmente similar: $"..."

Por el contrario $'...', la función de $"..."es bastante diferente. Hará que la cadena que contiene se traduzca de acuerdo con la configuración regional actual.

La echo -econtroversia

echo -eno es universalmente compatible con shells y muchos consideran la -eopción como un error de diseño. Observar:

$ ls
-e  -n
$ echo *
$ printf "%s\n" *
-e
-n

Como puede ver, si lo que está imprimiendo echocomienza con un guión, los resultados pueden ser inesperados. A menos que esté seguro de que la primera cadena con la que imprimirá echono comienza con un guión, probablemente sea mejor usarla printf.

Por estas razones, el estándar POSIX concluye :

Se alienta a las nuevas aplicaciones a usar printf en lugar de echo.

Chet Ramey, quien ha mantenido bashdurante los últimos 22 años, está de acuerdo :

[N] ew código debe usar printf.


1
También vale la pena señalar que tanto Chet como POSIX recomiendan usar en printflugar deecho
geirha

@geirha Muy buenos puntos. Respuesta actualizada
John1024

1
El problema de las opciones inesperadas de los globos (como *) en realidad no es específico echo. Ocurre con cualquier comando que reconozca opciones cortas o largas (escritas en la forma tradicional) y tome operandos de nombre de archivo, incluidosls . Podría decirse que la situación es un poco peor echoya que (como menciona su fuente) echogeneralmente no acepta --indicar el final de las opciones, mientras que uno puede escribir comandos como ls -- *l. (Y realmente uno debería escribir comandos de esa manera, cuando usa globos que comienzan con *o -, especialmente en los guiones).
Eliah Kagan

Gracias por la respuesta completa, tengo un ejercicio para mi Sistema Operativo de golf y que necesitaba para imprimir un texto utilizando la \nsecuencia de escape, lo que en realidad no importa si uso echo -e '...', echo $'...'oecho $"..."
Marcos
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.