Ao usar o shell do Linux, me deparo com a seguinte situação:
$ A=B\
> C
$ echo $A
BC
Na minha opinião, quando a nova linha encontra um caractere de escape, ela não pode ser um personagem de CR, mas ainda pode ser uma nova linha. O echo $A
deve ser interpretado como echo B newline C
e a nova linha deve ser um IFS para echo
. Portanto, a saída deve ser em B C
vez de BC
.
Por que obtenho a saída que recebo?
Respostas:
Citação
man bash
, seção CITAÇÃO :Isso permite que você quebre comandos muito longos / sequências de comandos (canalizando e transformando a saída etc.) em scripts em várias linhas para facilitar a leitura.
Para que ele trate a nova linha conforme o esperado, basta agrupar o valor (e qualquer uso posterior da variável) entre aspas.
Da mesma seção:
fonte
Respondendo o "porquê" como "por que isso é útil":
A barra invertida-nova linha é usada para a continuação de linha para dividir linhas longas ovely:
Uma barra invertida no final de uma linha em um script de shell faz com que o shell ignore a nova linha para fins de execução do script. Isso normalmente é usado para dividir linhas longas em um arquivo de script em várias linhas de texto, que serão manipuladas como uma única linha de script pelo shell.
Por exemplo, o comando
pode ser escrito como
fonte
significa "A é igual à string B, seguida por uma nova linha que estou ignorando, seguida por um C"
Não há CR no que você digitou, na medida em que o shell o vê. O fim de linha do Linux / Unix é um feed de linha (LF), não CR. O CR é emitido como parte do manuseio do terminal. A maioria dos terminais precisa de um avanço de linha para descartar uma linha e um retorno de carro para enviar o cursor de volta para a esquerda. O CR é inserido pelo kernel, ao enviar um Line Feed para o terminal, quando o terminal precisa disso - IOW, ele não é visível para o shell. Observe que, por exemplo, um editor visual pode separar o uso de CR e LF - o menor número de caracteres para a próxima parte da tela a ser reescrita pode envolver um LF (para ir direto para a página sem alterar a coluna).
Um pouco mais confuso, também há uma tradução de entrada para teclados. A tecla Enter geralmente envia um retorno de carro (Control-M). Mas, para reconhecer que um comando foi inserido, o shell precisa ver um Fim de Linha. Um
stty
parâmetro adicional descreve, portanto, para o tratamento do terminal do kernel, que um CR de entrada deve ser convertido em um fim de linha. Portanto, o shell ainda não vê um CR.O resultado final é que o terminal envia:
O shell recebe:
O shell analisa isso como "oh, nova linha de barra invertida - eu simplesmente ignoro isso" e termina com:
E na saída, o kernel modifica a sequência enviada ao terminal durante a entrada do comando como:
O processamento de núcleo de manipulação do terminal é gerido pelo comando shell
stty
e dependendo da implementação (Linux, Mac OS X, * BSD), subjacente detalhes devem estar sobman termios
,man tty_ioctl
.man console_ioctl
etc.fonte