Comment trouver le nombre de lignes verticales disponibles dans le terminal?

12

J'écris un script qui montre le journal git pour un répertoire quand je le cède. Un tel journal peut être écrasant, contenant des centaines de lignes. Jusqu'à présent, j'ai limité cela à 20 lignes codées en dur ( ... | head -n 20), ce qui est bien sur l'écran au travail, mais trop sur le petit écran du MacBook à la maison.

Je préférerais que le journal occupe environ la moitié de l'écran (vertical) de chaque terminal. Et "terminal" change également: c'est le terminal Gnome au travail, mais iTerm2 à la maison. Et je n'utilise ni écran ni tmux.

Comment trouver le nombre de lignes verticales disponibles dans un terminal à partir de la ligne de commande?

jalanb
la source

Réponses:

20

Les paramètres du terminal sont stockés sous forme de variables $LINESet $COLUMNS.

De plus, vous pouvez utiliser un programme d'opération de terme spécial, par exemple 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
la source
9
LINESet COLUMNSne sont fixés par des obus. bashles définit, mais uniquement pour un shell interactif (et il ne les exporte pas).
mr.spuratic
1
L'environnement vars n'existe pas dans mon tcsh. Je me demande également si le système les réinitialiserait si vous redimensionniez la fenêtre du terminal. Tput et stty fonctionnent pour moi, j'ai donc appris quelque chose de nouveau :-)
jamesqf
La documentation de bash @jamesqf indique "Défini automatiquement à la réception d'un SIGWINCH." donc, oui, cela les change si vous redimensionnez la fenêtre du terminal.
Celada
Pour l'autoset ci-dessus disponible, les options suivantes sont responsables shopt -s checkwinsizequi ont ajouté dans mon /etc/bash.bashrcfichier avec commentaire:# check the window size after each command and, if necessary, update the values of LINES and COLUMNS.
Costas
9

Cette commande devrait vous donner le nombre de lignes sur le terminal:

stty size | cut '-d ' -f1

Certains systèmes peuvent ne pas être implémentés stty size, vous pourriez donc avoir besoin de quelque chose comme ceci à la place:

stty -a | tr \; \\012 | grep rows | tr -d ' rows'
Celada
la source
1
Cela semble très spécifique au système d'exploitation. Pouvez-vous compiler la liste des systèmes où chaque incantation fonctionne?
Warren Young
4
J'avais peur que le premier soit spécifique au système d'exploitation, c'est pourquoi j'ai ajouté le second. En effet, après un peu de recherche sur Google, je constate que le premier ne fonctionnera probablement pas sur Solaris. Le second devrait être très portable. Honnêtement, @Costas ' tput linessemble être la meilleure réponse et je l'ai votée positivement. Je ne le savais pas avant.
Celada
1
Je voudrais offrir une longue pipe de remplacement avec stty -aquelque chose comme grep -Po 'rows \K[^;]*'oused -n 's/.*rows \([^;]*\).*/\1/p'
Costas
@Costas en fait, de façon frustrante, ni ma commande ni l'une des vôtres ne fonctionnait sur MacOS, j'ai donc dû proposer une commande différente (modifiée). Allez comprendre: MacOS émet "24 lignes" au lieu de "lignes 24"! Je pense toujours que tput linesc'est bien mieux, et je pense que c'est assez portable!
Celada