Como encontro o número de linhas verticais disponíveis no terminal?

12

Estou escrevendo um script que mostra o log git para um diretório quando eu faço o cd nele. Esse registro pode ser esmagador, contendo centenas de linhas. Até agora, tenho limitado isso a 20 linhas codificadas ( ... | head -n 20), o que é bom na tela do trabalho, mas muito na tela menor do MacBook em casa.

Eu preferiria que o log ocupasse cerca da metade da tela (vertical) em qualquer terminal. E o "terminal" também muda: é o terminal Gnome no trabalho, mas o iTerm2 em casa. E eu não uso screen ou tmux.

Como encontro o número de linhas verticais disponíveis em um terminal na linha de comando?

jalanb
fonte

Respostas:

20

Os parâmetros do terminal são armazenados como $LINESe $COLUMNSvariáveis.

Além disso, você pode usar um programa especial de operação a termo, por exemplo tput:

tput lines  # outputs the number of lines of the present terminal window.
tput cols   # outputs the number of columns of the present terminal window.
Costas
fonte
9
LINESe COLUMNSsão definidos apenas por algumas conchas. bashos define, mas apenas para um shell interativo (e não os exporta).
mr.spuratic
1
Os vários ambientes não existem no meu tcsh. Além disso, gostaria de saber se o sistema os redefiniria se você redimensionasse a janela do terminal. Ambos tput e stty fazer o trabalho para mim, então eu aprendi algo novo :-)
jamesqf
A documentação do @jamesqf bash diz "Definida automaticamente após o recebimento de um SIGWINCH". então sim, eles serão alterados se você redimensionar a janela do terminal.
Celada
Para o ajuste automático acima disponível, é responsável pelas seguintes opções, shopt -s checkwinsizeque foram adicionadas no meu /etc/bash.bashrcarquivo com comentários: ## check the window size after each command and, if necessary, update the values of LINES and COLUMNS.
Costas
9

Este comando deve fornecer o número de linhas no terminal:

stty size | cut '-d ' -f1

Alguns sistemas podem não ser implementados; stty sizeportanto, você pode precisar de algo assim:

stty -a | tr \; \\012 | grep rows | tr -d ' rows'
Celada
fonte
1
Isso parece muito específico do sistema operacional. Você pode compilar a lista de sistemas em que cada encantamento funciona?
21915 Warren Young
4
Eu estava com medo de que o primeiro pudesse ser específico do SO, e foi por isso que adicionei o segundo. De fato, depois de pesquisar um pouco no Google, vejo que o primeiro provavelmente não funcionará no Solaris. O segundo deve ser muito portátil. Honestamente, @Costas ' tput linesparece ser a melhor resposta e eu a votei de novo. Eu não sabia disso antes.
Celada
1
Eu gostaria de oferecer substituto longo tubo com stty -apor algo como grep -Po 'rows \K[^;]*'oused -n 's/.*rows \([^;]*\).*/\1/p'
Costas
@Costas, na verdade, frustrantemente, nem meu comando nem nenhum de vocês funcionaram no MacOS, então tive que criar um comando diferente (editado). Veja a figura: o MacOS emite "24 linhas" em vez de "linhas 24"! Eu ainda acho que tput linesé muito melhor, e acho que é bastante portátil!
Celada