Dans une situation d'utilisateur unique, si nous prenons l'exemple de xterm
, nous pouvons simplement compter le nombre de pids de xterm
; xterm
crée un pid distinct pour chaque fenêtre.
gnome-terminal
exécute cependant un seul pid, mais la bonne nouvelle est qu'il crée un processus enfant pour chaque fenêtre et / ou onglet. nous pouvons récupérer ces processus enfants par la commande:
pgrep -P <pid_of_gnome-terminal>
Il y a cependant quelques complications à gérer:
En lisant votre question, nous pouvons supposer que l' utilisateur dans ce cas est en fait le propriétaire de la x-session . Habituellement, nous pouvons simplement utiliser la $USER
variable -variable, mais cela peut ne pas correspondre à l'utilisateur actuellement connecté de $DISPLAY
.
Dans une situation multi-utilisateurs, les pids appartenant à l'application terminale (ou laquelle) n'appartiennent pas nécessairement au courant $DISPLAY
. Nous devons séparer uniquement les pids et les pids enfants pertinents.
Sous Unity (15.10 ou inférieur), si un deuxième utilisateur se connecte, un processus supplémentaire est démarré ( gnome-pty-helper
), qui apparaît comme un processus enfant dans gnome-terminal
, mais le processus (évidemment) n'a ni fenêtre ni onglet. Sur Mate , le processus existe quand même.
En bref
Pour compter le nombre d'onglets et / ou de fenêtres d'une application de terminal, nous devons:
- Voyez si nous exécutons une application de terminal qui a plusieurs pids ou un seul pid sur un
$DISPLAY
(x-session)
- À partir des processus en cours, séparez uniquement les pids pertinents, en cours d'exécution sur ce
$DISPLAY
- Si l'application exécute des processus enfants pour son pid (pour les fenêtres / onglets), voyez si elle
gnome-pty-helper
s'exécute, pour corriger le nombre.
Cependant, cela peut très bien être scripté, pour trouver de manière fiable le nombre de fenêtres et / ou d'onglets actuellement ouverts.
Le scénario
Dans le script ci-dessous, l'application de terminal ciblée est utilisée comme argument . Le script fonctionne sur de nombreux terminaux sur lesquels je l'ai testé. Une exception est Tilda
en ce moment.
Un exemple
- J'ai deux utilisateurs connectés, un (pas l'actuel) avec deux
gnome-terminal
fenêtres, un (celui de l'image) avec trois gnome-terminal
fenêtres et deux xterm
fenêtres.
La commande:
/path/to/get_terms.sh gnome-terminal
les sorties:
3
tandis que
/path/to/get_terms.sh xterm
les sorties:
2
Le scénario
#!/bin/bash
terminal=$1
# get the user running the current x-session
username=$(who | grep $DISPLAY | head -1 | awk '{print $1}')
# get the pid of the terminal for the current user
userpid=$(pgrep -u $username $terminal)
# check what type the terminal is (multi pid/single pid)
npids="$(echo "$userpid" | wc -w)"
# in case of a single pid, count the children
if [ "$npids" -eq 1 ]; then
# check if gnome-pty-helper runs (starts when multiple users are logged in)
ptpid=$(pgrep gnome-pty-helpe)
# get number of child- procs
let "orig = $( pgrep -P $(pgrep -u $username $terminal) | wc -w )"
# if pty-helper runs, correct the number of child procs
if [ -n "$ptpid" ] && [ -n "$userpid" ]; then
let "n_terms = $orig-1"; else let "n_terms = $orig"
fi
# if no child procs run, n-terminals = n-counted pids (difference Mate <> Unity)
if [ "$n_terms" -eq 0 ]; then echo $orig; else echo $n_terms; fi
# in case of multiple pids, count the pids
elif [ "$npids" -gt 1 ]; then echo $npids
fi
Utiliser
Copiez le script dans un fichier vide, enregistrez-le sous get_terms.sh
, rendez-le exécutable et exécutez-le par la commande:
/path/to/get_terms.sh <terminal_application>
tty
. Je suppose que nous / les autres nous sommes trop concentrés sur cette "question" et avons oublié qu'il pourrait y avoir d'autres solutions pour le "besoin" entier :) Je jouerais même avec l'implémentation d'un sélecteur de couleur aléatoire. S'il s'agit de 256 couleurs, la sélection de couleurs identiques / similaires ne devrait pas se produire beaucoup. Cependant, le réglage manuel des couleurs pour des nombres de points donnés donnera une meilleure personnalisation.