variável de shell de referência $ COLUMNS de dentro de um script bash

6

Isso é executado como esperado em um xterm: sha512sum <filename> | cut -c -$COLUMNS , mas não em um script #! /bin/bash , como dothis.sh <args> , porque $COLUMNS não é conhecido, por assim dizer.

Prefiro não transmitir $ COLUMNS como argumento nem exportá-lo para o ambiente.

O script não é crítico, precisa ser executado apenas em uma máquina, em uma linha de comando em um xterm.

Linux pre 3.2.0-4-amd64 #1 SMP Debian 3.2.81-2 x86_64 GNU/Linux
GNU bash, version 4.2.37
XTerm(278)
    
por Randy 19.10.2016 / 00:46

2 respostas

4
COLUMNS=$(tput cols)

Ou em uma linha

sha512sum <filename> | cut -c -"$(tput cols)"
    
por 19.10.2016 / 00:58
8

o bash define as variáveis do shell COLUMNS e LINES no modo interativo (houve problemas com o seu checkwinsize recurso que levou a essa distinção). Você pode obter essa informação de maneiras diferentes.

No contexto da pergunta, você sabe como criar um script de shell, mas não sabe onde obter dados úteis.

Na minha janela, tenho 40 linhas, 80 colunas:

  • tput cols tenta primeiro as variáveis de ambiente (desde eles não estão configurados em seu ambiente, e isso também é bom), depois tenta as configurações do terminal do sistema e, em seguida, as descrições dos terminais. Colocar o tamanho na descrição do terminal não é mais feito muito; é uma muleta usada por aplicativos termcap (como o bash). Você receberia apenas um único número, por exemplo,

    40

    Devido a uma falha histórica, em um sistema FreeBSD (veja histórico e notas de portabilidade ), você teria que usar tput co , porque (embora ncurses com terminfo seja usado como a biblioteca do sistema), ncurses ' tput não é usado com o FreeBSD. O NetBSD e o OpenBSD, é claro, entraram em outras tangentes.

  • stty size (disponível em várias plataformas) fornece os valores de linhas / colunas das configurações do terminal - ou nada, se esses não estiverem disponíveis. Ele fornece apenas dois números, que podem ser divididos facilmente em um shell:

    40 80

  • resize tenta o próprio terminal (usando seqüências de escape) e atualiza as configurações do terminal para Para o bash, você usaria resize -u , dando saída assim:

    COLUMNS=80;
    LINES=40;
    export COLUMNS LINES;

Nenhuma dessas opções é muito usada em cron porque não há terminal envolvido. Mas todos eles são utilizáveis em um terminal.

    
por 19.10.2016 / 02:38