¿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 \\ncaso?
Agradezco cualquier explicación de lo que está sucediendo en las líneas anteriores.

echo -ede 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 -eimpresión-een su salida).echo -eno es seguro:echose comportará de acuerdo con la norma si ambosposixyxpg_echoestán habilitados en tiempo de ejecución opciones, o si compilados con opciones de tiempo de compilación equivalentes. La práctica segura es usarprintfen su lugar: consulte las secciones USO DE LA APLICACIÓN y JUSTIFICACIÓN del enlace anterior que describe cómo hacer queprintfactúe como un reemplazoecho.Respuestas:
Esto es porque
bashyecho -ecombinado. Desdeman 1 bashEl punto es: la barra invertida entre comillas dobles no siempre es especial.
Hay varias implementaciones de
echoen 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\dicebashque trate al segundo\literalmente;echoobtiene\ Hello!y actúa como se indica arriba.echo -e "\\\ Hello!"- el primero\dicebashque trate al segundo\literalmente;echoobtiene\\ Hello!y (por-e) reconoce\\como\.echo -e "\\\\ Hello!"- el primero\dicebashque trate al segundo\literalmente; el tercero dice lo mismo del cuarto;echoobtiene\\ Hello!y (por-e) reconoce\\como\.echo -e "\\\\\ Hello!"- el primero\dicebashque trate al segundo\literalmente; el tercero dice lo mismo del cuarto; el último no es especial;echoobtiene\\\ 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\ncomo una nueva línea.echo -e "\\n Hello!"-bashinterpreta\\como\;echoobtiene\n Hello!y el resultado es el mismo que el anterior.echo -e "\\\n Hello!"-bashinterpreta la inicial\\como\;echoobtiene\\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 unbashcomportamiento diferente ) o sin-e(echocomportamiento diferente ).fuente
-ejueces, el texto ya juzgado por bash, ¿es correcto? si eso es correcto, eso elimina la confusión. ¿Podrías mencionar cómo sesedcomporta? ¿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 (sedsolo sobre ), solo haga su propia investigación primero.sedseguirá 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-eescapará de las dos barras invertidas resultantes\\ny luego se convertirán\n. ahora quien interpreta\npara que sea nueva línea? Normalmente en caso deecho -e "\n Hello!", bash no hace nada, e-einterpreta\ncomo una nueva línea. pero en la primera situación mencionada, el proceso de interpretación se realizó antes\nde ser interpretado. ¿Podría explicar eso por favor?sedque me confundió anoche (tal vez hice algo mal ayer), pero ahora intenté de nuevo lo mismo conecho -eysed, y obtuve lo mismo que exceptuado, ¡gracias!