Em uma situação de usuário único, se usarmos o exemplo de xterm
, podemos simplesmente contar o número de pids de xterm
; xterm
cria um pid separado para cada janela.
gnome-terminal
no entanto, executa um único pid, mas a boa notícia é que ele cria um processo filho para cada janela e / ou guia. podemos recuperar esses processos filhos pelo comando:
pgrep -P <pid_of_gnome-terminal>
No entanto, existem algumas complicações para lidar com:
Lendo sua pergunta, podemos assumir que, nesse caso , o usuário é realmente o proprietário da x-session . Geralmente, podemos simplesmente usar a $USER
variável-, mas isso pode não corresponder ao usuário atualmente conectado $DISPLAY
.
Em uma situação multiusuário, os pids pertencentes ao (ou qual) aplicativo de terminal não pertencem necessariamente ao atual $DISPLAY
. Precisamos separar apenas os pids e pids relevantes.
No Unity (15.10 ou inferior), se um segundo usuário efetuar login, um processo adicional será iniciado ( gnome-pty-helper
), que aparecerá como um processo filho gnome-terminal
, mas o processo (obviamente) não terá janela ou guia. No Mate , o processo existe de qualquer maneira.
Em resumo
Para contar o número de guias e / ou janelas de um aplicativo de terminal, precisamos:
- Veja se executamos um aplicativo de terminal com vários pids ou um único pid em um
$DISPLAY
(x-session)
- Nos processos em execução, separe apenas os pids relevantes, executando neste
$DISPLAY
- Se o aplicativo executar processos filhos para seu pid (para janelas / guias), veja se
gnome-pty-helper
é executado, para corrigir o número.
No entanto, isso pode muito bem ser guiado por script, para encontrar com segurança o número de janelas e / ou guias atualmente abertas.
O script
No script abaixo, o aplicativo de terminal de destino é usado como argumento . O script funciona em muitos terminais em que eu testei. Uma exceção está Tilda
neste momento.
Um exemplo
- Eu tenho dois usuários conectados, um (não o atual) com duas
gnome-terminal
janelas, um (aquele na imagem) com três gnome-terminal
janelas e duas xterm
janelas.
O comando:
/path/to/get_terms.sh gnome-terminal
saídas:
3
enquanto
/path/to/get_terms.sh xterm
saídas:
2
O script
#!/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
Usar
Copie o script em um arquivo vazio, salve-o como get_terms.sh
, torne-o executável e execute-o pelo comando:
/path/to/get_terms.sh <terminal_application>
tty
. Eu acho que nós / outros nos concentramos demais nessa "questão" e esqueci que pode haver outras soluções para toda a "necessidade" :) Eu até brincaria com a implementação do seletor de cores aleatório. Se houver 256 cores, a seleção de cores iguais / semelhantes não deve acontecer muito. No entanto, a configuração manual de cores para determinados números de pontos dará uma melhor personalização.