¿Cuál es la diferencia entre usar
echo -e "Hello\nWorld"
y
echo $"Hello\nWorld"
¿No salen ambos?
Hello
World
command-line
bash
marca
fuente
fuente
Hello\nWorld
. Necesita el-e
interruptor para interpretar los caracteres de escape.echo $'Hello\nWorld'
, que se imprimirán en dos líneas debajo de bash.Respuestas:
echo -e
yecho $'...'
son similares en el sentido de que admiten las siguientes secuencias de escape:Ellos tienen diferencias. Además de lo anterior,
echo -e
admite:Por el contrario,
$'....'
admite:Observe que, entre los dos, las
\c
extensiones son incompatibles: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.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 -e
controversiaecho -e
no es universalmente compatible con shells y muchos consideran la-e
opción como un error de diseño. Observar: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 usarlaprintf
.Por estas razones, el estándar POSIX concluye :
Chet Ramey, quien ha mantenido
bash
durante los últimos 22 años, está de acuerdo :fuente
printf
lugar deecho
*
) en realidad no es específicoecho
. 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 peorecho
ya que (como menciona su fuente)echo
generalmente no acepta--
indicar el final de las opciones, mientras que uno puede escribir comandos comols -- *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 usoecho -e '...'
,echo $'...'
oecho $"..."