Eu escrevi este script (bastante feio) para encontrar o comando para executar um aplicativo em execução clicando nele. Ele usa xprop
para obter a "interface de cliques" e para obter informações sobre a janela selecionada:
#!/bin/bash
xprop > ./tmp
chk_desk='grep -c "_NET_WM_DESKTOP_FILE(STRING)" ./tmp' #Checks whether application has a corresponding .desktop file. The '-c' counts the number of matches.
if [ $chk_desk -ne 0 ] ; then
desk_line='grep "_NET_WM_DESKTOP_FILE(STRING)" ./tmp' #Extract line containing .desktop path
desk_path=${desk_line/"_NET_WM_DESKTOP_FILE(STRING) = "/} #Extract only the .desktop path
desk_path=${desk_path//\"/} #Removes quotes
exe_line='grep "Exec=" $desk_path | head -n1'
exe=${exe_line/"Exec="/}
else #If .desktop doesn't exist, it uses the PID to find the executable
pid_line='grep "_NET_WM_PID(CARDINAL)" ./tmp'
pid=${pid_line/"_NET_WM_PID(CARDINAL) = "/}
exe_path='readlink -f /proc/$pid/exe'
exe=${exe_path/\/usr\/bin\//}
fi
echo $exe
rm ./tmp
exit 0
Caso você esteja se perguntando, eu não poderia ter usado apenas o PID para correspondência, pois /proc/$pid/exe
fornece o caminho do executável "real" ou do serviço subjacente que está executando o programa. Então, se você usou em 'geogebra', o script irá gerar java. Ou, no caso do Firefox, você obteria o caminho /usr/lib/firefox/firefox
, que, suponho, é onde o executável do firefox existe, o que significa que /usr/bin/firefox
aponta para ele.
Embora o firefox não seja um grande problema (você pode usar o executável "real"), para os aplicativos baseados em java, o arquivo .desktop é necessário para que o comando execute o aplicativo real e não uma sessão java vazia.
Esse script, é claro, só funcionará se você estiver usando o X como seu servidor de exibição (já que ele usa xprop). Tenho certeza de que deve haver uma maneira de tornar o script mais limpo, embora meu principal problema fosse ter que criar muitas variáveis para armazenar as saídas de linha grep
e as várias substituições.