Seu problema parece não ser como aqui-documentos funcionam, já que você descreveu corretamente o uso deles em arquivos de script. Parece que você não entende o uso interativo deles. O seguinte é um curso intensivo (muito simplificado) que esperamos esclarecer o assunto para você.
Shells, como todos os processos do Unix em geral, possuem fluxos de entrada e saída para ler e gravar dados, indo e voltando. Eles têm pelo menos um fluxo de entrada (chamado stdin
) e dois fluxos de saída ( stdout
e stderr
), mas podem abrir e fechar quantos forem necessários, para leitura e gravação (principalmente, para ler arquivos ou escreva para eles). Quais processos fazem com seus fluxos depende deles. cat
, por exemplo, quando chamado sem argumentos, copia seu stdin
para stdout
. Os shells geralmente interpretam seus fluxos de entrada como comandos a serem executados (e configuram fluxos de entrada e saída para esses comandos de acordo com alguma sintaxe).
De onde vêm os dados de entrada? Eles podem vir de outros processos, enviá-los, podem ser lidos de arquivos ou podem ser digitados diretamente pelo usuário, que é a situação mais comum para o stdin de um shell. Nesse caso, deve haver outro programa, levando a entrada do usuário e carregando-a no fluxo. Tal programa é chamado de tty
e nesse caso dizemos que o fluxo é anexado a um tty (o tty é diferente do programa de emulação de terminal que fornece uma janela para ele, mas você também pode em termos gerais, diz que o fluxo está conectado a um terminal .
Os shells sabem quando seu stdin é anexado a um tty e se comportam de maneira diferente, por exemplo, imprimindo um prompt ao aguardar entrada, mas não há muitas outras diferenças. Um prompt geralmente é algo como user@host:current_path$
. Seu conteúdo exato pode ser definido alterando a variável PS1
. Uma convenção usual é que ela termina com $
quando você é um usuário normal e com #
quando você é root
.
Quando você executa um script, o shell anexa um fluxo de entrada ao arquivo que o contém e lê comandos dele. Se um dos comandos contiver um aqui-documento , isto é, algo como <<END
, isso significa: de agora em diante, até uma linha contendo exatamente apenas este terminador, pare de interpretar os dados do fluxo como comandos e passá-los para o stdin do comando que você vai executar ( cat
no seu caso), possivelmente com alguma confusão que não vai incomodar-nos agora. Isso é o que você já sabe, embora possivelmente em outra perspectiva.
Quando a entrada é anexada a um tty, um aqui-documento significa o mesmo: pare de interpretar os dados do fluxo como comandos e passe-os para o stdin do comando que você irá executar, até o terminador. Única diferença, imprima um prompt ao aguardar entrada; Esse prompt é diferente daquele que o shell iria imprimir se fosse interpretar os dados de entrada como comandos, apenas para avisá-los que eles serão repassados. Ele é definido pela variável PS2
e seu valor é padronizado como >
. Você o vê no início de cada linha depois de digitar cat file > file << "END"
, até que o terminador seja lido, quando o shell retomar seu comportamento normal, imprime seu PS1
-prompt e espera que a entrada seja interpretada como comandos.
Espero que isso ajude.