A substituição do comando Bash não está funcionando como esperado

4

Gostaria de ver as últimas linhas de um arquivo, mas quero alinhar as colunas. Basicamente, quero desabilitar o wordwrap.

Isso é simples com:

tail $FILE | cut -c -80

Mas estou tentando generalizar meu script para outros usuários e gostaria de reduzir para a largura real do terminal, que eu posso usar:

stty size | cut -d" " -f2

Então eu imagino que eu poderia apenas

tail $FILE | cut -c -'stty size | cut -d" " -f2'

mas não funciona:

stty: standard input: Invalid argument
cut: invalid range with no endpoint: -
Try 'cut --help' for more information.

(Mesmos resultados com a expansão 'new' $ ().)

Agora, se eu fizer eco, parece bem:

echo cut -c -'stty size | cut -d" " -f2'
cut -c -103

Estou apenas sentindo falta de um escape? Ou isso de alguma forma não é possível?

Obrigado.

    
por Joe Fruchey 24.06.2013 / 14:37

2 respostas

3

A razão pela qual isso não funciona é porque stty é executado dentro de um pipe. Por isso, não "vê" o terminal subjacente. Em seu script, você poderia armazenar a largura do terminal em uma variável como

size='stty size | cut -d" " -f2'

e, em seguida, use o seguinte:

tail $FILE | cut -c -$size
    
por 24.06.2013 / 14:48
1

O Bash mantém a largura da tela na variável COLUMNS , que você pode usar em um pipeline:

tail $FILE | cut -c -$COLUMNS
    
por 25.06.2013 / 03:59