Por que não ecoa interpretar uma nova linha?

4

No bash, quando escrevo esta linha

new_line="new\nline"

Eu recebo isso como esperado:

echo $new_line
new\nline

E isso também funciona como esperado:

echo -e $new_line 
new
line

como diz em um manual: -e enable interpretation of backslash escapes No entanto, isso não me dá um caractere de linha de novo \n interpretado:

cur_log=$(who)
echo -e $cur_log
myuser pts/0 2017-01-19 07:10 (:0) myuser pts/1 2017-01-19 09:26 (:0) myuser pts/4 2017-01-19 09:14 (:0)

Eu pensei que não há um novo caractere de linha, mas se eu escrever:

echo "$cur_log"

Eu recebo um novo caractere de linha interpretado.

myuser  pts/0        2017-01-19 07:10 (:0)
myuser  pts/1        2017-01-19 09:26 (:0)
myuser  pts/4        2017-01-19 09:14 (:0)

Por que o echo -e $cur_log não interpreta o novo caractere de linha, mas o que 'echo-e $ new_line faz?

    
por Hrvoje T 19.01.2017 / 14:46

1 resposta

5

O motivo está na sua primeira variável ( new_line ), existe apenas uma sequência de escape (ou seja, \n = backslash seguido por n ) que é passado inalterado para echo , enquanto na segunda um ( cur_log ), existem novas linhas reais que são removidas pelo shell que faz parte da variável IFS .

Uma nova linha é, sob Unix / Linux, um único caractere que o código ASCII é 10 (line- alimentação). Quando um arquivo contendo esse caractere é exibido na tela, ele é convertido em dois caracteres, retorno de carro mais feed de linha ( CR-LF ), 10 + 13 . Quando um editor como gedit abre esse arquivo, ele armazena cada linha separadamente. O avanço de linha é usado apenas para detectar a separação entre duas linhas contíguas. \n é composto por dois caracteres, ASCII 92 + 110 . Se você editar um arquivo contendo ocorrências de \n , esses dois caracteres permanecerão inalterados e exibidos como estão, ao contrário das novas linhas reais.

    
por 19.01.2017 / 14:55

Tags