Вопрос или проблема
У меня есть скрипт, который запускает новое окно терминала, и я хочу переместить его в определённое положение на левом терминале с помощью xdotool.
После запуска терминала я выполняю
xdotool search --class gnome-term
и использую возвращаемый идентификатор окна (Window ID) в командах xdotool windowsize и windowmove, чтобы установить размер и положение нового окна терминала.
xdotool windowsize $WIN_ID 1978 407
xdotool windowmove $WIN_ID -26 702
Поскольку у меня запущено несколько терминалов, мне нужно определить, какой WIN_ID связан с последним созданным окном терминала.
В скрипте я выполняю следующую команду перед запуском нового терминала, чтобы получить список существующих WIN_ID.
for i in `xdotool search --class gnome-term`; do id_list="$id_list $i"; done
Пример содержимого $id_list:
65011713 65011722 65103242 65019818 65029314 65027106
После запуска нового терминала, чтобы определить новый WIN_ID, я выполняю следующий тест.
for WID in `xdotool search --class gnome-term`; do if [[ ! $WID =~ $id_list ]]; then echo "New Window ID = $WID"; fi; done
Когда я запускаю эту команду, вместо того чтобы получить только один (новый) Window ID, я получаю все Window ID, связанные с классом gnome-terminal. Почему нижеприведённая команда не возвращает только WID, который не находится в id_list?
if [[ ! $WID =~ $id_list ]]; then ...
Скрипт:
...
...
# Генерируем список идентификаторов окон для существующих окон gnome-terminal
for i in `xdotool search --class gnome-term`; do id_list="$id_list $i"; done
# Запускаем новое окно терминала
gnome-terminal
# Получаем идентификатор окна нового терминала
New_WID=`for WID in `xdotool search --class gnome-term`; do if [[ ! $WID =~ $id_list ]]; then echo $WID; fi; done`
...
...
Спасибо за ваше время и отзывы!
Текс
Если вы хотите найти идентификаторы окон, которые появились с тех пор, как вы в последний раз запускали xdotool search --class gnome-term
, по сути, это делается с вычитанием списка.
Это можно сделать, например:
#! /bin/zsh -
die() { print -ru2 -C1 -- "$@"; exit 1; }
before=( $(xdotool search --class gnome-term) )
gnome-terminal
after=( $(xdotool search --class gnome-term) )
new_wid=( ${after:|before} )
(( $#new_wid == 1 )) || die "$#new_wid new window${new_wid[2]+s} found"
xdotool windowsize $new_wid 1000 500 $new_wid 12582932 -26 702
Если бы вам пришлось использовать bash, в котором нет оператора вычитания списка, вы могли бы использовать comm
, чтобы сделать это:
#! /bin/bash -
println() { [ "$#" -eq 0 ] || printf '%s\n' "$@"; }
die() { println >&2 "$@"; exit 1; }
before=( $(xdotool search --class gnome-term | sort) )
gnome-terminal
after=( $(xdotool search --class gnome-term | sort) )
new_wid=( $(comm -13 <(println "${before[@]}") <(println "${after[@]}")) )
(( ${#new_wid[@]} == 1 )) ||
die "${#new_wid[@]} new window${new_wid[1]+s} found"
xdotool windowsize "$new_wid" 1978 407 "$new_wid" 12582932 -26 702
Ответ или решение
Для решения задачи нахождения нового идентификатора окна терминала после его открытия, можно использовать подход, основанный на сравнении списков идентификаторов окон до и после открытия нового терминала. Поскольку в вашем случае вы работаете в среде Bash, я предоставлю вам корректный скрипт, который будет выполнять нужные действия.
Скрипт на Bash
#!/bin/bash
# Функция для вывода сообщений об ошибках
die() {
echo "$@" >&2
exit 1
}
# Получаем список идентификаторов окон gnome-terminal до открытия нового окна
before=($(xdotool search --class gnome-terminal | sort))
# Запускаем новое окно терминала
gnome-terminal &
# Ждем немного, чтобы новое окно успело открыться
sleep 1
# Получаем список идентификаторов окон gnome-terminal после открытия нового окна
after=($(xdotool search --class gnome-terminal | sort))
# Нахождение нового идентификатора окна, который появился
new_wid=($(comm -13 <(printf "%s\n" "${before[@]}") <(printf "%s\n" "${after[@]}")))
# Проверяем, нашли ли мы ровно одно новое окно
if [ ${#new_wid[@]} -ne 1 ]; then
die "${#new_wid[@]} новое окно(ок) найдено. Ожидалось одно."
fi
# Изменяем размер и положение нового окна
xdotool windowsize "${new_wid[0]}" 1978 407
xdotool windowmove "${new_wid[0]}" -26 702
Объяснение скрипта
-
Определение функции
die
: Эта функция используется для вывода сообщений об ошибках и завершения скрипта в случае проблем. -
Сбор идентификаторов окон: Сначала мы собираем список идентификаторов окон терминала (
gnome-terminal
) в массивbefore
. Используем командуsort
, чтобы обеспечить упорядоченность. -
Запуск нового окна терминала: После запуска нового окна используем
sleep 1
, чтобы дать системе время для создания окна. -
Сравнение списков идентификаторов: Снова собираем список идентификаторов окон в массив
after
и используем командуcomm
для нахождения идентификаторов, которые есть в спискеafter
, но отсутствуют в спискеbefore
. -
Проверка количества новых окон: Если найдено более одного нового идентификатора окна, скрипт завершается с ошибкой.
-
Изменение размера и положения: Если найден только один новый идентификатор, используем
xdotool
для изменения его размера и положения.
Заключение
Этот подход подходит для ситуаций, когда нужно идентифицировать новое окно, не рискуя получить неверные результаты из-за существующих окон. Используя данный скрипт, вы сможете успешно управлять новыми оконными идентификаторами в вашей среде gnome-terminal.