Я хотел бы узнать, возможно ли при запуске скрипта оболочки закрыть все остальные открытые окна консоли, не закрывая то, в котором запущен скрипт оболочки.
Я использую консоль Kubuntu 16.04.
Заранее спасибо!
решение1
Это не работает с Уэйландом!Если вы используете Ubuntu 17.10 или более новую версию и не перешли на использование Xorg при входе в систему, это решение не для вас.
Для таких задач, как та, которую я использую xdotool
, вам может потребоваться сначала установить ее с помощью:
sudo apt install xdotool
Вот мой сценарий:
#!/bin/bash
search="--class xterm"
a=$(xdotool getactivewindow getwindowpid)
b="$(xdotool search $search getwindowpid %@)"
for i in $b; do
[[ $a -ne $i ]] &&
echo kill $i
done
Поскольку вы не указали, какой эмулятор терминала вы используете, я написал скрипт для xterm
этого, но вы можете легко изменить это, изменив кавычки во второй строке. --class xterm
— это xdotool --search
опция, которая соответствует окнам xterm
класса окна. Прочитайте раздел «КОМАНДЫ ОКНА»man xdotool
чтобы узнать об этих вариантах, протестировать их, используйте
xdotool getactivewindow getwindowpid
чтобы получить PID активного окна терминала и
xdotool search YOUROPTIONS getwindowpid %@
чтобы получить PID всех соответствующих окон YOUROPTIONS
, например
xdotool search --all --name yourwindowsname --desktop 1 --class getwindowpid %@
для сопоставления всех окон с именем, yourwindowsname
находящимся на рабочем столе 1
. --all
означает, что должны быть выполнены оба условия (логическое «и»), по умолчанию используется --any
противоположное значение.
Когда все настроено и скрипт выводит правильные команды, выйдите echo
из него, чтобы выполнить kill
действия.
Оказывается, в KDE konsole
PID, сообщаемый программой, xdotool
одинаков для всех окон, поэтому нам нужен немного другой подход:
#!/bin/bash
search="--onlyvisible --class konsole"
a=$(xdotool getactivewindow)
b="$(xdotool search $search)"
for i in $b; do
[[ $a -ne $i ]] &&
xdotool windowclose $i
done