In una singola situazione utente, se prendiamo l'esempio di xterm
, possiamo semplicemente contare il numero di pid di xterm
; xterm
crea un pid separato per ogni finestra.
gnome-terminal
esegue comunque un singolo pid, ma la buona notizia è che crea un processo figlio per ogni finestra e / o scheda. possiamo recuperare questi processi figlio con il comando:
pgrep -P <pid_of_gnome-terminal>
Vi sono tuttavia alcune complicazioni da affrontare:
Leggendo la tua domanda, possiamo presumere che l' utente in questo caso sia effettivamente proprietario della x-session . Di solito possiamo semplicemente usare $USER
-variable, ma questo potrebbe non corrispondere all'utente attualmente connesso $DISPLAY
.
In una situazione multiutente, i pid appartenenti all'applicazione (o quale) dell'applicazione terminale, non appartengono necessariamente alla corrente $DISPLAY
. Dobbiamo dividere solo le offerte e le offerte figlio pertinenti.
Su Unity (15.10 o precedente), se un secondo utente accede, viene avviato un processo aggiuntivo ( gnome-pty-helper
), che appare come un processo figlio in gnome-terminal
, ma il processo (ovviamente) non ha finestre o schede. Su Mate , il processo esiste comunque.
In breve
Per contare il numero di schede e / o finestre di un'applicazione terminale, dobbiamo:
- Vedi se eseguiamo un'applicazione terminale che ha più pid o un singolo pid su uno
$DISPLAY
(x-session)
- Dai processi in esecuzione, dividere solo i pid rilevanti, in esecuzione su questo
$DISPLAY
- Se l'applicazione esegue processi figlio per il suo pid (per finestre / schede), vedere se
gnome-pty-helper
viene eseguita, per correggere il numero.
Questo può comunque essere ben scritto, per trovare in modo affidabile il numero di finestre e / o schede attualmente aperte.
Il copione
Nello script seguente, l'applicazione terminale di destinazione viene utilizzata come argomento . Lo script funziona su molti terminali su cui l'ho provato. Un'eccezione è Tilda
in questo momento.
Un esempio
- Ho effettuato l'accesso con due utenti, uno (non quello corrente) con due
gnome-terminal
finestre, uno (quello nell'immagine) con tre gnome-terminal
finestre e due xterm
finestre.
Il comando:
/path/to/get_terms.sh gnome-terminal
uscite:
3
mentre
/path/to/get_terms.sh xterm
uscite:
2
Il copione
#!/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
Usare
Copia lo script in un file vuoto, salvalo come get_terms.sh
, rendilo eseguibile ed eseguilo con il comando:
/path/to/get_terms.sh <terminal_application>
tty
. Immagino che noi / altri ci siamo concentrati troppo su quella "domanda" e abbiamo dimenticato che potrebbero esserci altre soluzioni per l'intera "necessità" :) Giocherei persino con l'implementazione del selettore di colori casuale. Se ha 256 colori, la selezione di colori uguali / simili non dovrebbe succedere molto. Tuttavia, l'impostazione manuale dei colori per determinati numeri di punti consentirà una migliore personalizzazione.