web-dev-qa-db-fra.com

Utiliser xdotool pour compter le nombre d'onglets dans gnome-terminal

J'essaie de trouver un moyen de déterminer le nombre d'onglets ouverts dans une fenêtre de gnome-terminal. Actuellement, la meilleure option semble être xdotool. Je peux passer à l'onglet suivant en utilisant

xdotool key ctrl+Page_Down

le seul problème est qu'il n'y a qu'un seul onglet ouvert. Ensuite, la commande ci-dessus génère des ordures dans la fenêtre du terminal. Les ordures sont ces trois caractères ;5~ (qui est probablement la représentation des caractères pour Ctrl + PuntDown).

Comment puis-je éviter xdotool ou gnome-terminal de la sortie de ces trois caractères? (Hors sujet: je voudrais également savoir si quelqu'un sait s'il existe d'autres moyens de déterminer le nombre d'onglets ouverts dans une fenêtre de gnome-terminal)

4
Håkon Hægland

À partir d'un shell dans le terminal, vous voulez compter les onglets sur quelque chose comme ça pourrait fonctionner

ps -h --ppid `ps -ho ppid $$` | grep pts | wc -l

Les onglets partagent un processus parent commun et seront associés à un pseudo-terminal (pts). La variable $$ contient l'ID de processus du shell appelant. Le commutateur -h indique à "ps" de supprimer la ligne d'en-tête par défaut et le commutateur -o lui indique d'utiliser un format personnalisé pour renvoyer uniquement l'ID de processus parent. Les backticks indiquent retourner la valeur de cette commande. Ainsi, la sortie des backticks sera l'ID de processus numérique du parent du shell actuel. Passé à 'ps' avec le commutateur --ppid renvoie tous les processus avec ce parent. Filtrez avec grep pour l'association TTY et les lignes de comptage.

2

méthode # 1

Oneliner à exécuter dans la même fenêtre que vous avez compté:

expr $( echo $( xprop -root | awk '/_NET_ACTIVE_WINDOW/ && /0x/ {print $5}' | xargs xwininfo -all -id | awk '/child/ || /children/ {print $1}' ) ) / 2

Voici le one-liner en action et rapporte correctement 5 onglets ouverts  enter image description here

Explication:

Ce que j'ai remarqué à propos de gnome-terminal, c'est que lorsque vous exécutez xwininfo -all -id 0xXXXXXXX (Où 0xXXXXX est l'identifiant numérique de cette fenêtre), il signale 3 enfants pour une seule fenêtre, 5 enfants pour une fenêtre avec 2 onglets, 7 enfants pour 3 onglets, etc. Voir le motif? Si vous effectuez une division entière (c'est-à-dire que vous n'obtenez le nombre entier que lorsque vous divisez les enfants par 2, vous obtenez le nombre d'onglets).

Voilà donc ce que cette ligne fait essentiellement expr $(stuff that gets number of children) / 2

Comment puis-je obtenir le nombre d'enfants? Je recherche la sortie de xprop -root Pour la chaîne qui a l'identifiant numérique de la fenêtre active, donne cet identifiant numérique à xwindowinfo -all -id Comme argument, puis recherche cette sortie pour le nombre d'enfants.

Avantage de cette méthode? Donne le nombre exact d'onglets dans la fenêtre dans laquelle vous l'exécutez. Désavantage ? ne fonctionne que dans gnome-terminal, ne fonctionne pas dans sakura

méthode # 2 (brute et moins bonne)

Il y a un autre moyen que j'ai trouvé mais cela ne fonctionne que pour une seule fenêtre. Si vous exécutez who -a, Vous verrez quelque chose comme ceci:

serg  + pts/7        2015-04-11 08:47 00:02       17540 (:0)
serg  + pts/2        2015-04-11 08:27 00:12       17540 (:0)
serg  + pts/12       2015-04-11 08:50 00:08       17540 (:0)
serg  + pts/13       2015-04-11 08:56 00:01       17540 (:0)
serg  + pts/14       2015-04-11 08:58   .         17540 (:0)

Remarquez le signe +? Oui, si vous êtes dans une seule fenêtre, vous pouvez exécuter cette commande dans cette même fenêtre who -a | grep "+" | wc -l. Maintenant, Kenneth Stevenson a correctement mentionné qu'ils partagent le même pid et sont associés à un pseudo-terminal? Oui, toutes les fenêtres font ça. Donc, si vous avez une autre fenêtre ouverte, cette méthode vous donnera un résultat incorrect.

1