Como o arquivo "END" do Cat funciona?

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

Não sabe como funciona o truque acima.

cat > file é um pouco compreensível para mim, isso significa que a saída de cat está sendo redirecionada e gravada em file .

Como essa parte << "END" funciona? Eu presumo pelo menos que isso significa que a string END deve ser tratada como entrada para cat - assim, se alguma coisa, eu diria que no final file deve conter apenas uma linha com três letras: %código%. Quão possível isso significa "aceitar entrada do console e redirecioná-la para END até que o usuário digite essa string, que deve ser tratada como um delimitador" está além de mim.

    
por gaazkam 09.02.2017 / 21:15

1 resposta

5

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.

    
por 09.02.2017 / 23:03