Por que a combinação de 'menos' e 'script' interrompe as terminações de linha?

2

Este bash snippet imprimirá os números de 1 a 10:

$ for i in $(seq 1 10); do echo $i; done
1
2
3
4
5
6
7
8
9
10

Quando tento usar isso com script e less da seguinte forma:

$ script -q -c 'for i in $(seq 1 10); do echo $i; done' /dev/null | less

... vejo isso em vez disso:

1
 2
  3
   4
    5
     6
      7
       8
        9
         10
           (END)

O prompt usual less também não aparece. O que está acontecendo aqui?

Estou fazendo isso no Ubuntu 13.10, script é script from util-linux 2.20.1 , less is less 458 (GNU regular expressions) .

    
por detly 05.12.2013 / 00:58

1 resposta

4

Você está vendo a saída para o terminal enquanto ele não está no modo NLCR (stty -onlcr).

Normalmente, o driver do kernel para ttys exibe um retorno de carro juntamente com uma nova linha sempre que uma nova linha é enviada. Com o modo NLCR, as novas linhas desativadas são exibidas como estão, o que move o cursor uma linha para baixo, mas deixa-o na mesma coluna. Isso produz a saída escalonada que você vê acima. A razão pela qual o terminal está neste modo é less o define dessa forma em preparação para executar seu trabalho, que é a saída de paginação.

O "(END)" que você vê é less anunciando o fim da condição de entrada. Como script está gravando em / dev / null e no terminal e não em stdout, less nunca recebe nada em stdin. Como script está lendo do terminal, less recebe EOF quando tenta ler também um comando do terminal e sai.

    
por 05.12.2013 / 02:18