Если ваша терминальная оболочка имеет легкий доступ к своему собственному идентификатору окна X, вы, вероятно, делаете что-то не так! Они не имеют ничего общего друг с другом - например, вы можете (и должны) выполнять длинные задания на screen
которые теоретически могут выводить на любое количество терминалов в любой точке мира.
Тем не менее, я решаю эту проблему, используя возможность подсказки обновлять "статус"/"заголовок" терминала для сообщения PID оболочки, как в следующем приглашении:
PS1=\u@\H:\w\$\ \[\e]2;\u@\H:\w [$$]\a\]
Любой псевдотерминал, показывающий оболочку с этим приглашением и PID 6399, имеет заголовок вроде user@host:~ [6399]
. Затем, используя такой инструмент, как wmctrl, вы можете написать скрипт bash, такой как этот:
win_from_pid() {
type wmctrl &>/dev/null || return 1
wmctrl -l | awk '/^.*\['"$1"'\]$/ { print $1 }'
}
Это выполняет поиск в списке окон и дает вам идентификаторы X Window любого конца, заканчивающегося этим заголовком. Таким образом, функция win_from_pid $$
может сообщить вам идентификаторы вашего окна на том же хосте, на котором выполняется скрипт, если таковой имеется. Вы можете выяснить, как определить фокус оттуда. :)