Je rencontre un problème où j'essaie d'obtenir la taille d'un terminal à l'aide de scripts. Normalement, j'utiliserais la commande tput cols
à l'intérieur de la console, mais je veux pouvoir accomplir cette fonctionnalité en utilisant strictement des scripts.
À partir de maintenant, je peux détecter la console en cours d'exécution et obtenir son chemin de fichier. Cependant, j'ai du mal à utiliser ces informations pour obtenir la largeur de la console. J'ai essayé d'utiliser la commande tput
, mais je suis relativement nouveau sur Linux / scripts, donc je ne sais pas vraiment quoi faire.
La raison pour cela est que je veux pouvoir configurer une entrée cron qui informe la console de sa largeur / colonnes de temps en temps.
Voici 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_columns.sh
#!/usr/bin/env bash
echo $(/usr/bin/tput cols)
La sortie normale de TERMINAL
& TERMINALPATH
are et , par exemple &pts/terminalnumber
/dev/pts/terminalnumber
pts/0
/dev/pts/0
la source
cron
emplois avaient des terminaux de contrôle.Réponses:
La
tput
commande est un excellent outil, mais malheureusement, elle ne peut pas récupérer les paramètres réels d'un terminal sélectionné arbitrairement.La raison en est qu'il lit stdout pour les caractéristiques du terminal, et c'est également là qu'il écrit sa réponse. Donc, au moment où vous essayez de capturer la sortie de
tput cols
vous, vous avez également supprimé la source de ses informations.Heureusement,
stty
lit stdin plutôt que stdout pour sa détermination des caractéristiques du terminal, c'est ainsi que vous pouvez récupérer les informations de taille dont vous avez besoin:Soit dit en passant, il est inutilement lourd d'écrire ceci sous la forme
echo $(/usr/bin/tput cols)
.Pour toute construction que
echo $(some_command)
vous exécutezsome_command
et capturez sa sortie, que vous passez ensuiteecho
à la sortie. Dans presque toutes les situations, vous pouvez imaginer que vous pourriez tout aussi bien simplement exécutersome_command
et laisser le produit directement. C'est plus efficace et aussi plus facile à lire.la source
tput
/nurses
? Le mien (ncurses 6.0.20160625) fait le TIOCGWINSZ sur stderr s'il ne peut pas le faire sur stdout.cols=$(tput cols)
oucols=$(tput cols 2<> /dev/ttyx)
fonctionne très bien.ncurses 5.7.20100313
ici. Êtes-vous certain quecols=$(tput cols 2<> /dev/tty1)
cela ne fonctionne pas pour vous?tput cols
lit-il depuis stderr . Je dois maintenant trouver comment réécrire ma réponse ...stty size <"$terminal" | read rows columns
au lieu d'essayer d'analyserstty -a
tput cols
ettput lines
interrogez la taille du terminal (à partir du pilote de périphérique du terminal, pas du terminal lui-même) à partir du périphérique terminal sur sa sortie standard, et si stdout n'est pas un périphérique terminal comme dans le cascols=$(tput cols)
où il s'agit alors d'un tuyau, de stderr.Donc, pour récupérer les valeurs d'un périphérique terminal arbitraire, vous devez ouvrir ce périphérique sur le stderr de
tput
:(ici ouvert en mode lecture seule, il
tput
ne génère pas de messages d'erreur là-bas).Vous pouvez également utiliser
stty size
.stty
interroge le terminal sur stdin:Aucun de ceux-ci n'est standard donc peut (et en pratique ne fonctionnera pas) sur tous les systèmes. Il devrait cependant ê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é à POSIX mais la discussion ne semble aller nulle part.la source
Ce script:
A travaillé ici avec absolument rien de plus .....
Pourquoi définissez-vous une variable d'environnement avec des données? COLUMNS = $ (/ home / test / Documents / get_columns.sh)
Essayez-vous d'obtenir les colonnes et les lignes d'un autre script ou tty? Est-ce que c'est ça? Toujours étrange pour moi parce que vous définissez la variable d'environnement des colonnes pour le script local ....
la source
cron
travail de l'OP pour un terminal particulier.cron
travail interroge un terminal particulier pour ses caractéristiques. (Je ne sais pas vraiment pourquoi il doit faire cela, mais c'est ce que le PO veut.)Ma réponse est différente de celle de Roaima, car elle est dynamique. Sa / Sa réponse vous donne la taille du terminal à la création. Si vous utilisez par exemple un gestionnaire de fenêtres de mosaïque, comme i3 ou bspwm, vous préférez avoir la largeur actuelle du terminal. J'utilise donc ssty du paquet coreutils:
La solution de Luciano fonctionne parfaitement dans xterm et xfce4-terminal. Je ne sais pas si tous les terminaux définissent la variable $ COLUMNS.
la source