Вы также можете искать PID с помощью wmctrl , и я думаю, что это лучший способ сделать это. xwininfo вернет все виды сущностей, которые выглядят как окна, но вы не найдете их на рабочем столе.
Если вы делаете man wmctrl
вы обнаружите, что wmctrl -l перечисляет все окна, которые фактически видны на вашем рабочем столе, с (самое главное) их идентификаторами окон и заголовками . -p добавляет PID и -x добавит классы окон .
Как сказано в руководстве (RTFM, верно?: D), wmctrl также может выполнять поиск по некоторым из них и активировать окно, соответствующее поиску. Однако я понятия не имею, что определяет, какое из возможных совпадений будет возвращено. С другой стороны, вы можете использовать предоставленную функцию листинга, чтобы написать оболочку, которая делает поиск лучше и, возможно, основанную на некоторых других свойствах (таких как отметка времени последнего доступа к окну), которые вы можете получить, запросив предоставленный win id в xprop, например.
Эти строки кода ниже возвращают самый последний экземпляр окна класса сопряженного терминала:
XTIME="_NET_WM_USER_TIME" #a shorter name for xprop query that shoul return timestamps
export TMPDIR=/dev/shm #save tmp files to memory to make it faster
LST=`mktemp` #tmp file to store our listing
wmctrl -lx | awk -F' ' '{printf("%s\t%s \t",$1,$3); for(i=5;i<=NF;i++) printf("%s",$i); printf("\n") }' > $LST #pretty-print our listing of windows into the tmp file
#To each line of listing, prepend a timestamp acquired via an xprop call
#Use awk to find a line whose 3rd column (winclass) matches the window class "mate-terminal.Mate-terminal" and among those that do, find the one whose timestamp is the largest
while read LINE; do ID=`echo "$LINE"|cut -f 1`; TIME=`xprop -id $ID $XTIME`; TIME="${TIME/* = /}"; echo -e "$TIME\t$LINE" ; done <$LST ) | awk -v s="mate-terminal.Mate-terminal" '$3 == s {if($1>max){max=$1;line=$0};};END{print line}'
rm $LST #delete tmp file
Во всяком случае, для того, что вы описываете, вы создаете - на вашем месте я бы выяснил, какой класс окон генерирует ваша желаемая команда, а затем основал бы мой поиск на этом, а не на PID. В качестве альтернативы можно предположить, что команда CMD, возможно, сгенерирует окна с именем класса, включающим CMD.
После того, как вы нашли свою линию, вы должны использовать идентификатор окна
активировать окно через wmctrl.
Надеюсь, это поможет.
Примечание: я обнаружил, что xdotool может выполнять поиск по именам классов и заголовкам окон, но это крайне медленно . На моем компьютере этот bash-скрипт (который вызывает довольно много внешних утилит) работает в 10 раз быстрее, чем скомпилированная альтернатива xdotool: P.