¿Cómo funciona cat> file << "END"?

$ cat > file << "END" > asdf > qwerty > END $ cat file asdf qwerty $ 

No estoy seguro de cómo funciona el truco anterior.

cat > file es algo comprensible para mí, significa que la salida de cat se está networkingirigiendo y escribiendo en un file .

¿Cómo funciona esta parte << "END" ? Por lo less supondré que significa que la cadena END debe tratarse como input a cat , por lo tanto, en todo caso, supongo que al final el file debe contener solo una línea con tres letras: END . La posibilidad de que esto signifique "aceptar la input desde la console y networkingirigirla a cat hasta que el usuario escriba esta cadena, que debe tratarse como un delimitador" me supera.

Parece que su problema no es cómo funcionan los documentos aquí , ya que ha descrito correctamente su uso en los files de script. Parece que no entiendes su uso interactivo. El siguiente es un curso acelerado (muy simplificado) que con suerte aclarará el asunto para usted.

Las shells, al igual que todos los processs de Unix en general, tienen flujos de input y salida para leer y escribir datos, de un lado a otro. Tienen al less un flujo de input (llamado stdin ) y dos flujos de salida ( stdout y stderr ), pero pueden abrir y cerrar tantos como quieran, para readind y para escritura (principalmente, para leer de files o escribir en ellos) . Qué processs hacen con sus flujos depende de ellos. cat , por ejemplo, cuando se llama sin arguments, copy su stdin a stdout . Las shells generalmente interpretan sus flujos de input como commands para ser ejecutados (y configuran flujos de input y salida para esos commands de acuerdo con alguna syntax).

¿De dónde provienen los datos de input? Pueden provenir de otros processs que los envían, se pueden leer de files o el usuario los puede escribir directamente, que es la situación más normal para el código fuente de un intérprete de commands. En este caso, debe haber otro progtwig que tome la input del usuario y la cargue en la secuencia. Tal progtwig se llama tty y en este caso decimos que el flujo está conectado a un tty (el tty es diferente del progtwig de emulación de terminal que proporciona una window para él, pero también se puede decir, en términos generales, que el flujo es unido a una terminal ) .

Los shells saben cuando su stdin está conectado a un tty y se comportan de manera diferente, por ejemplo, imprimen un post cuando esperan la input, pero en realidad no hay muchas otras diferencias. Un aviso suele ser algo así como user@host:current_path$ . Su contenido exacto se puede definir alterando la variable PS1 . Una convención habitual es que termina con $ cuando eres un usuario normal y con # cuando eres root .

Cuando ejecuta un script, el shell adjunta un flujo de input al file que lo contiene y lee los commands del mismo. Si uno de los commands contiene un documento aquí , es decir, algo así como <<END , esto significa: de ahora en adelante, hasta una línea que contenga exactamente solo este terminador, deje de interpretar los datos de la secuencia como commands y páselos a la stdin del command que vas a ejecutar ( cat en tu caso), posiblemente con algunos cambios que no nos molestarán ahora. Esto es lo que ya sabes, aunque posiblemente en otra perspectiva.

Cuando la input se adjunta a un tty, un documento aquí significa lo mismo: deje de interpretar los datos del flujo como commands y páselos al stdin del command que va a ejecutar, hasta el terminador. Única diferencia, imprima un aviso cuando espere la input; este post es diferente del que imprimiría el intérprete de commands si fuera a interpretar los datos de input como commands, solo para informarle que serán transmitidos. Está definido por la variable PS2 y su valor pnetworkingeterminado es > . Lo ve al comienzo de cada línea después de escribir cat file > file << "END" , hasta que se lee el terminador, cuando el shell reanuda su comportamiento normal, imprime su PS1 -prompt y espera a que la input se interprete como commands.

Espero que esto ayude.