web-dev-qa-db-fra.com

Obtenir la largeur de la console à l'aide d'un script Bash

Je rencontre un problème dans lequel j'essaie d'obtenir la taille d'un terminal en utilisant des scripts. Normalement, j'utiliserais la commande tput cols À l'intérieur de la console, mais je souhaite pouvoir accomplir cette fonctionnalité en utilisant strictement des scripts.

Dès maintenant, je suis capable de détecter la console d'exécution et d'obtenir son chemin de fichier. Cependant, je me lance d'utiliser ces informations pour obtenir la largeur de la console. J'ai tenté d'utiliser la commande tput, mais je suis assez nouveau à Linux/scripts, donc donc ne savez donc pas vraiment quoi faire.

La raison de cela est que je veux être capable de configurer une entrée A cron qui notifie la console de sa largeur/de ses colonnes de temps en temps.

Ceci est mon code jusqu'à présent:

tty.sh

#!/bin/bash

#Get PID of terminal
#terminal.txt holds most recent PID of console in use
value=$(</home/test/Documents/terminal.txt)

#Get tty using the PID from terminal.txt
TERMINAL="$(ps h -p $value -o tty)"
echo $TERMINAL

#Use tty to get full filepath for terminal in use
TERMINALPATH=/dev/$TERMINAL
echo $TERMINALPATH

COLUMNS=$(/home/test/Documents/get_columns.sh)
echo $COLUMNS

get_columnshshsh

#!/usr/bin/env bash
echo $(/usr/bin/tput cols)

La sortie normale de TERMINAL & TERMINALPATH sont pts/terminalnumber et /dev/pts/terminalnumber, par exemple pts/0 & /dev/pts/0

16
sirgeezer21

tput cols Et tput lines Requête la taille de la borne (à partir du pilote de périphérique terminal, pas la borne elle-même) du terminal de son stdout, et si le stdout n'est pas un périphérique de terminal comme dans le Coque de cols=$(tput cols) Où est alors un tuyau, de StDerr.

Donc, pour récupérer les valeurs d'un terminal arbitraire, vous devez ouvrir cet appareil sur STDERR de tput:

{ cols=$(tput cols) rows=$(tput lines); } 2< "$TERMINALPATH"

(Ici ouvert en mode lecture seule, alors tput _ ne diffuse pas ses messages d'erreur).

Sinon, vous pourrez peut-être utiliser stty size. stty interroge le terminal sur stdin:

read rows cols < <(stty size < "$TERMINALPATH")

Aucun de ceux-ci n'est standard, alors peut (et dans la pratique) ne fonctionne pas sur tous les systèmes. Cela devrait bien être assez portable pour les systèmes GNU/Linux.

L'ajout de stty size Ou une autre méthode pour interroger la taille du terminal a été demandée à POSIX mais la discussion ne semble pas aller nulle part.

14
Stéphane Chazelas

Ce script:

#!/bin/bash

echo "The number of columns are $COLUMNS"
echo "The number of lines are $LINES"

Travaillé ici avec absolument rien de plus .....

Pourquoi vous définissez une variable d'environnement avec des données? Colonnes = $ (/ home/test/documents/get_columns.sh)

Essayez-vous d'obtenir les colonnes et les lignes d'un autre script ou de TTY? Est-ce que c'est ça? Encore étrange pour moi, car vous définissez la variable d'environnement de colonnes pour le script local ....

9

Ma réponse est différente de celle de Roaima, puisqu'elle est dynamique. Sa seule réponse vous donne la taille du terminal à la création. Si vous êtes par exemple en utilisant un gestionnaire de fenêtres de carrelage, comme I3 ou BSPWM, vous préférez avoir la largeur de courant du terminal. Ainsi, j'utilise SSTY de l'emballage Coreutils:

#!/bin/bash
stty size | awk '{print $2}'

La solution de Luciano fonctionne parfaitement dans Xterm et Xfce4-terminal. Je ne sais pas si tous les terminaux définissent la variable $ de colonnes.

1
Sasha