Qual é o nome da variável de ambiente (?) com a largura do terminal atual?

4

Eu sei que isso é algo simples, mas não consigo lembrar onde ele está localizado / nomeado.

Onde a variável para a largura atual do terminal é armazenada?

Eu vejo esta resposta fala sobre mudar as coisas: Como o comprimento e a largura do terminal são encaminhados sobre SSH e telnet?

Mas gostaria de obter o valor atual, para uso em um script (e não entendo tudo nessa resposta).

Era uma vez que eu lembrei que havia alguma maneira de exibir todas as variáveis de ambiente? (Hmm, vejo uma resposta que diz usar set (vs. env ), mas meu set mostra apenas LINHAS e não largura?)

Então, é claro, é para o próximo problema; uma vez que eu tenho esse número $, eu gostaria de repetir um caractere ("-") que muitas vezes, para fazer uma linha tracejada com largura de caracteres X (preenche o terminal, sem encapsular). Se você tem uma maneira elegante, eu deveria estar fazendo isso, eu também apreciaria isso.

    
por user3082 13.07.2015 / 07:29

4 respostas

6

TAMANHO DE STTY

A maneira canônica é perguntar ao terminal sobre seu tamanho real, quando você quer conhecê-lo

stty size

imprime COLARES DE LINHAS.

Imprimir uma linha tracejada

Sobre sua segunda pergunta, seq é seu amigo

stty size|if read rows cols
then for x in 'seq $cols'
do printf "-"
done fi

ou por awk loop

stty size|awk '{ ORS="-"; n=$2; for (i=0; i<n; ++i) { print ""; } }'

.

Definir uma variável de linha

Mas, na verdade, seria melhor salvar nossa linha em uma variável

eval $(L=""; stty size|if read r c
    then for x in 'seq $c'
    do L="${L}-"
    done
    echo L="$L"
    fi
)

Armadilha no SIGWINCH

Contanto que não seja necessário recalcular o tamanho do terminal

trap 'echo "recalculate L"' SIGWINCH

agora podemos usar $L para imprimir a linha. Claro que você pode autotune sua variável $L em SIGWINCH :

trap 'eval $(L=""; stty size|if read r c
    then for x in 'seq $c'
    do L="${L}-"
    done
    echo L="$L"
    fi
)' SIGWINCH

Em um terminal onde você configura, como trap , você pode apenas dizer

echo $L

e você está feito.

    
por 13.07.2015 / 07:43
1

Está em set em COLUMNS.

echo $COLUMNS

ou

set | grep -i columns

no bash.

    
por 13.07.2015 / 07:43
1

Eu acredito que você esteja procurando pela variável $COLUMNS .

Como para fazer um caractere abranger toda a largura do terminal, esse é um loop simples baseado no valor de $COLUMNS . Se a tela for redimensionada com essas linhas no histórico, elas parecerão bastante desagradáveis.

    
por 13.07.2015 / 07:42
0

Não há variável environment que contenha a largura do terminal. Existe uma variável shell : COLUMNS (e da mesma forma LINES para a altura). Esta é apenas uma variável do shell, não é visível para os programas invocados pelo shell.

A razão COLUMNS é apenas uma variável do shell e não é exportada para o ambiente porque, uma vez que a variável esteja no ambiente, o shell não pode modificá-la. Se você redimensionar o terminal, o shell (ou, mais geralmente, qualquer programa em primeiro plano) recebe um sinal SIGWINCH . Quando o shell recebe um SIGWINCH, ele consulta o terminal em seu tamanho atual e atualiza as variáveis COLUMNS e LINES de acordo.

O comando set lista todas as variáveis do shell, de modo que inclui COLUMNS e LINES . Os comandos env e export listam apenas variáveis de ambiente, de modo que não inclua COLUMNS e LINES .

Você pode exportar COLUMNS para torná-lo uma variável de ambiente. Mas observe que, no momento em que um aplicativo o utiliza, as informações podem estar obsoletas, se o terminal tiver sido redimensionado nesse meio tempo. Um aplicativo pode consultar o tamanho do terminal da mesma forma que o terminal, e registrar um manipulador para o sinal SIGWINCH para que ele possa manter as informações atualizadas.

¹ Ao enviar os comandos ioctl corretos. Ou até mesmo chamando stty size ou tput cols .

    
por 14.07.2015 / 03:09