¿Podría alguien explicar qué está sucediendo detrás de escena en el escape de personajes en el shell de Linux? Intenté lo siguiente y busqué mucho en Google, sin ningún éxito en comprender qué (y cómo) está sucediendo:
root@sv01:~# echo -e "\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\\ Hello!"
\\\ Hello!
root@sv01:~# echo -e "\n Hello!"
Hello!
root@sv01:~# echo -e "\\n Hello!"
Hello!
root@sv01:~# echo -e "\\\n Hello!"
\n Hello!
Estoy totalmente perdido allí, así que, por ejemplo, ¿por qué tres barras diagonales inversas solo dan una barra diagonal inversa? Esperaría: los dos primeros se escaparán a uno, el tercero no encontrará nada para escapar, por lo que seguirá siendo una barra oblicua (línea en el primer experimento), pero lo que está sucediendo es que el tercero simplemente desaparece.
¿Por qué obtengo una barra diagonal inversa de cuatro \\\\ Hello
? Esperaría que cada par dé una barra diagonal inversa -> dos barras diagonales inversas.
¿Y por qué necesito tres barras invertidas en el último caso para \ n escapar? ¿Qué está pasando en el fondo de escapar para conseguir eso? ¿Y en qué se diferencia del \\n
caso?
Agradezco cualquier explicación de lo que está sucediendo en las líneas anteriores.
echo -e
de todos modos, el comportamiento no está definido por los estándares; consulte pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html . La salida está completamente definida por la implementación si hay una barra diagonal inversa en cualquier lugar de las entradas, y la única opción permitida es-n
(lo que significa que una implementación que cumpla con los estándares tendrá unaecho -e
impresión-e
en su salida).echo -e
no es seguro:echo
se comportará de acuerdo con la norma si ambosposix
yxpg_echo
están habilitados en tiempo de ejecución opciones, o si compilados con opciones de tiempo de compilación equivalentes. La práctica segura es usarprintf
en su lugar: consulte las secciones USO DE LA APLICACIÓN y JUSTIFICACIÓN del enlace anterior que describe cómo hacer queprintf
actúe como un reemplazoecho
.Respuestas:
Esto es porque
bash
yecho -e
combinado. Desdeman 1 bash
El punto es: la barra invertida entre comillas dobles no siempre es especial.
Hay varias implementaciones de
echo
en general, es una función incorporadabash
; Lo importante aquí es este comportamiento:Ahora podemos decodificar:
echo -e "\ Hello!"
- nada especial parabash
, nada especial paraecho
;\
corsé.echo -e "\\ Hello!"
- el primero\
dicebash
que trate al segundo\
literalmente;echo
obtiene\ Hello!
y actúa como se indica arriba.echo -e "\\\ Hello!"
- el primero\
dicebash
que trate al segundo\
literalmente;echo
obtiene\\ Hello!
y (por-e
) reconoce\\
como\
.echo -e "\\\\ Hello!"
- el primero\
dicebash
que trate al segundo\
literalmente; el tercero dice lo mismo del cuarto;echo
obtiene\\ Hello!
y (por-e
) reconoce\\
como\
.echo -e "\\\\\ Hello!"
- el primero\
dicebash
que trate al segundo\
literalmente; el tercero dice lo mismo del cuarto; el último no es especial;echo
obtiene\\\ Hello!
y (debido a-e
) reconoce la inicial\\
como\
, la última\
permanece intacta.Y así. Como puede ver, hasta cuatro barras invertidas consecutivas dan uno como resultado. Es por eso que necesita (al menos) nueve de ellos para obtener tres. 9 = 4 + 4 + 1.
Ahora con
\n
:echo -e "\n Hello!"
- no hay nada especial parabash
, echo obtiene la misma cadena y (debido a-e
) interpreta\n
como una nueva línea.echo -e "\\n Hello!"
-bash
interpreta\\
como\
;echo
obtiene\n Hello!
y el resultado es el mismo que el anterior.echo -e "\\\n Hello!"
-bash
interpreta la inicial\\
como\
;echo
obtiene\\n Hello!
y (debido a-e
) se interpreta\\
como un literal\
que debe imprimirse.Los resultados serían diferentes con en
'
lugar de"
(debido a unbash
comportamiento diferente ) o sin-e
(echo
comportamiento diferente ).fuente
-e
jueces, el texto ya juzgado por bash, ¿es correcto? si eso es correcto, eso elimina la confusión. ¿Podrías mencionar cómo sesed
comporta? ¿Tiene su propia construcción en técnica de escape? entonces quiero decir, ¿se comporta como eco con-e
?sed
. Sin embargo, puede hacer otra pregunta (sed
solo sobre ), solo haga su propia investigación primero.sed
seguirá los mismos principios básicos: bash interpretará la línea de comando de acuerdo con sus reglas, analizando (y tal vez eliminando) las comillas y los escapes. El resultado de eso se pasa ased
, que lo interpreta de acuerdo con sus reglas de escape. Por cierto, puede simplificar esto usando una cadena entre comillas simplesbash
, ya que eso no tiene una interpretación de escape simple hecha (por bash): bash elimina las comillas simples y pasa lo que está dentro de ellas directamente al comando.echo -e "\\\n Hello!"
si acaso. Aquí bash escapará , y se convertirá\\n
, luego-e
escapará de las dos barras invertidas resultantes\\n
y luego se convertirán\n
. ahora quien interpreta\n
para que sea nueva línea? Normalmente en caso deecho -e "\n Hello!"
, bash no hace nada, e-e
interpreta\n
como una nueva línea. pero en la primera situación mencionada, el proceso de interpretación se realizó antes\n
de ser interpretado. ¿Podría explicar eso por favor?sed
que me confundió anoche (tal vez hice algo mal ayer), pero ahora intenté de nuevo lo mismo conecho -e
ysed
, y obtuve lo mismo que exceptuado, ¡gracias!