Qual é a lógica por trás da expressão cat foo “wordofchoice” [duplicate]

0

Eu sei o > e > > operadores, > coloca algo em um arquivo, excluindo o conteúdo antigo, > > acrescenta algo no final do conteúdo do arquivo.

Quando eu só uso

cat > foo

Eu sou capaz de escrever várias linhas em foo interativamente até que eu pressione ctrl + z, do que termina.

Agora, se eu adicionar o operador append na ordem inversa com alguma palavra de minha escolha

cat > foo << "wordofchoice"

Eu posso fazer o mesmo que no primeiro caso, mas desta vez um > prompt aparece no início de cada linha e eu não posso terminar a entrada interativa por ctrl + z, mas digitando "wordofchoice" (sem os sinais de aspas duplas).

Por que é assim, qual é a lógica por trás dessa expressão, o < < operador não parece ter o seu significado de acrescentar algo aqui.

    
por Abdul Al Hazred 22.03.2015 / 01:19

1 resposta

1
  • $PS2
    • Cada vez que o usuário insere um \n ewline antes de concluir uma linha de comando em um shell interativo, o valor dessa variável deve ser submetido à expansão do parâmetro e gravado no erro padrão. O valor padrão é > .

Você vê o > porque esse é o valor padrão para $PS2 - que é a string de prompt que o shell imprimirá quando não puder delimitar corretamente uma cadeia de comando que contenha uma nova linha.

Sua string de comando não pode ser delimitada porque você não fechou uma string entre aspas:

  • Os vários mecanismos de cotação são o caractere de escape, aspas simples e aspas duplas. O aqui-documento representa outra forma de citar; veja aqui-documento .

O analisador do shell tokeniza entrada à medida que lê isso - linha por linha. Você enviou um \n ewline - que também significa que seu terminal acabou de enviar uma cópia do comando até agora - mas ele detecta pelo menos uma cadeia de caracteres aberta entre aspas - em outras palavras, um comando incompleto - e então avisa pelo resto ...

  • Se o caractere atual for \ barra invertida, ' aspas simples ou " aspas duplas e não estiver entre aspas, deverá afetar as citações dos caracteres subseqüentes até o final do texto citado. As regras de cotação são descritas em Citações . Durante o reconhecimento de tokens, nenhuma substituição será realmente executada, e o token de resultado deverá conter exatamente os caracteres que aparecem na entrada (exceto \n ewline > unindo) , não modificados, incluindo quaisquer citações embutidas ou incluídas ou operadores de substituição, entre a marca de referência \'" e o final do texto citado. O token não deve ser delimitado até o final do campo citado.

O documento aqui é uma forma especial de citar, pois também é um redirecionamento - o shell redireciona sua entrada como delimitado pelo token aberto <<heredoc_delimiter_string\n e o token de fechamento esperado \nheredoc_delimiter_string\n para command <<start_here_document .

  • O documento aqui deve ser tratado como uma única palavra que começa após o próximo \n ewline e continua até que haja uma linha contendo apenas o <<delimiter e um \n ewline, sem caracteres blank entre eles. Então o próximo documento aqui começa, se houver um. O formato é o seguinte:

    [n]<<word here-document delimiter

O shell se comportaria de maneira semelhante se você enviasse qualquer outro token de shell que implicasse um segundo no analisador do shell, mas o entregasse uma nova linha antes do token de fim. $PS2 será impresso, por exemplo, se você iniciar um loop for sem inserir done antes de inserir um \n ewline ou uma das outras citações já mencionadas.

Outra maneira de colocar um \n ewline em um comando é citá-lo com o terminal - normalmente, você pode literalmente citar o próximo caractere de entrada com CTRL+V . Se você usar CTRL+V , em seguida, CTRL+J (ou \n ewline) , você pode inserir um literal \n ewline na cadeia de comando sem o terminal enviar ao shell uma cópia de sua entrada imediatamente - porque geralmente o terminal envia linha por linha, mas quando você CTRL+V cita o delimitador de nova linha, o shell ainda não irá recebê-lo e, portanto, não solicitará mais informações.

Isso não implica, entretanto, que o terminal cotado como nova linha também seja corretamente citado para o shell - você precisaria fazer isso com aspas de shell conforme aplicável - mas evitará que a cadeia de comando seja lida, pelo menos, até você está pronto para enviá-lo.

    
por 22.03.2015 / 01:42