Как закрыть все открытые окна терминала, кроме того, в котором запущен скрипт оболочки

Как закрыть все открытые окна терминала, кроме того, в котором запущен скрипт оболочки

Я хотел бы узнать, возможно ли при запуске скрипта оболочки закрыть все остальные открытые окна консоли, не закрывая то, в котором запущен скрипт оболочки.

Я использую консоль 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 konsolePID, сообщаемый программой, 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

Связанный контент