Usando xdotool para contar o número de abas no gnome-terminal

4

Estou tentando encontrar uma maneira de determinar o número de abas abertas em uma janela do terminal gnome. Atualmente, a melhor opção parece ser xdotool . Posso passar para a próxima guia usando

xdotool key ctrl+Page_Down

o único problema é se houver apenas uma única guia aberta. Em seguida, o comando acima gera lixo na janela do terminal. O lixo são esses três caracteres ;5~ (que é provavelmente a representação de caracteres para Ctrl + Page_Down).

Como posso evitar que xdotool ou gnome-terminal exibam esses três caracteres? (Off topic: Eu também gostaria de saber se alguém sabe se há outras maneiras de determinar o número de abas abertas em uma janela do gnome-terminal)

    
por Håkon Hægland 09.04.2015 / 21:10

2 respostas

2

De um shell no terminal em que você deseja contar as guias em algo como isso pode funcionar

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

As guias compartilham um processo pai comum e serão associadas a um pseudo-terminal (pts). A variável $$ contém o id do processo do shell de chamada. A opção -h diz ao 'ps' para suprimir a linha de cabeçalho padrão e a opção -o diz para usar um formato customizado para retornar apenas o id do processo pai. Os backticks dizem retornar o valor desse comando. Portanto, a saída dos backticks será o ID do processo numérico do pai do shell atual. Passado para 'ps' com o parâmetro --ppid, retorna todos os processos com esse pai. Filtrar com grep para associação de TTY e linhas de contagem.

    
por Kenneth Stevenson 09.04.2015 / 21:34
1

método # 1

O Oneliner será executado na mesma janela que você deseja contar:

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

Aqui está o one-liner em ação e relata corretamente 5 abas abertas

Explicação:

O que eu notei sobre o gnome-terminal é que quando você executa xwininfo -all -id 0xXXXXXXX (onde 0xXXXXX é o ID numérico dessa janela), ele relata 3 filhos para uma única janela, 5 filhos para uma janela com 2 guias, 7 crianças por 3 guias e assim por diante. Veja o padrão? Se você fizer a divisão inteira (isto é, obter apenas o número inteiro quando você divide as crianças por 2, você obtém o número de abas).

Então é isso que essa linha está basicamente fazendo expr $(stuff that gets number of children) / 2

Como obtenho o número de crianças? Eu procuro a saída de xprop -root para a cadeia que tem id numérico da janela ativa, forneça esse ID numérico para xwindowinfo -all -id como argumento e, em seguida, pesquise essa saída para o número de filhos.

Vantagem desse método? Dá o número exato de abas na janela que você executa. Desvantagem? só funciona no gnome-terminal, não funciona em sakura

método # 2 (bruto e não tão bom)

Existe outra maneira que encontrei, mas funciona apenas para uma janela. Se você executar who -a , verá algo assim:

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)

Observe o sinal +? Sim, se você estiver em uma única janela, poderá executar esse comando na mesma janela who -a | grep "+" | wc -l . Agora, Kenneth Stevenson mencionou corretamente que eles compartilham o mesmo pid e estão associados ao pseudo-terminal? Sim, todas as janelas fazem isso. Portanto, se você tiver outra janela aberta, esse método fornecerá um resultado incorreto.

    
por Sergiy Kolodyazhnyy 11.04.2015 / 18:27