Проблема сопоставления нового идентификатора терминального окна с xdotool в Bash

Вопрос или проблема

У меня есть скрипт, который запускает новое окно терминала, и я хочу переместить его в определённое положение на левом терминале с помощью 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

Объяснение скрипта

  1. Определение функции die: Эта функция используется для вывода сообщений об ошибках и завершения скрипта в случае проблем.

  2. Сбор идентификаторов окон: Сначала мы собираем список идентификаторов окон терминала (gnome-terminal) в массив before. Используем команду sort, чтобы обеспечить упорядоченность.

  3. Запуск нового окна терминала: После запуска нового окна используем sleep 1, чтобы дать системе время для создания окна.

  4. Сравнение списков идентификаторов: Снова собираем список идентификаторов окон в массив after и используем команду comm для нахождения идентификаторов, которые есть в списке after, но отсутствуют в списке before.

  5. Проверка количества новых окон: Если найдено более одного нового идентификатора окна, скрипт завершается с ошибкой.

  6. Изменение размера и положения: Если найден только один новый идентификатор, используем xdotool для изменения его размера и положения.

Заключение

Этот подход подходит для ситуаций, когда нужно идентифицировать новое окно, не рискуя получить неверные результаты из-за существующих окон. Используя данный скрипт, вы сможете успешно управлять новыми оконными идентификаторами в вашей среде gnome-terminal.

Оцените материал
Добавить комментарий

Капча загружается...