¿Cuál es la diferencia entre usar
echo -e "Hello\nWorld"
y
echo $"Hello\nWorld"
¿No salen ambos?
Hello
World
echo $'Hello\nWorld'
, que se imprimirán en dos líneas debajo de bash.
¿Cuál es la diferencia entre usar
echo -e "Hello\nWorld"
y
echo $"Hello\nWorld"
¿No salen ambos?
Hello
World
echo $'Hello\nWorld'
, que se imprimirán en dos líneas debajo de bash.
Respuestas:
echo -e
y 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 -e
admite:
\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 \c
extensiones son incompatibles:
$ echo -e 'start\n\cIstop'
start
$ echo $'start\n\cIstop'
start
stop
Para lo echo -e
anterior, \c
suprime la salida adicional, ignorando así Istop
. Por el contrario, para $'...'
, el \cI
se interpreta como una pestaña.
$"..."
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.
echo -e
controversiaecho -e
no es universalmente compatible con shells y muchos consideran la -e
opció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 echo
comienza con un guión, los resultados pueden ser inesperados. A menos que esté seguro de que la primera cadena con la que imprimirá echo
no 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 bash
durante los últimos 22 años, está de acuerdo :
[N] ew código debe usar printf.
*
) 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 echo
ya que (como menciona su fuente) echo
generalmente 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).
\n
secuencia de escape, lo que en realidad no importa si uso echo -e '...'
, echo $'...'
oecho $"..."
Hello\nWorld
. Necesita el-e
interruptor para interpretar los caracteres de escape.