Как закрыть все открытые окна терминала, за исключением того, что работает сценарий оболочки

Это неудачная ошибка в Unity. Кто-то отправил обходной путь, хотя я сам не пробовал.

-1
задан 15 November 2017 в 12:15

3 ответа

Это не работает с Wayland! Если вы используете 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. Прочтите раздел «WINDOW COMMANDS» man xdotool, чтобы узнать об этих параметрах, чтобы проверить их использование

xdotool getactivewindow getwindowpid

, чтобы получить PID активного терминала и

xdotool search YOUROPTIONS getwindowpid %@
[d8 ], чтобы получить 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
0
ответ дан 22 May 2018 в 16:15
  • 1
    Я попытался использовать ваш код, но он не работает. Когда я использую getwindowpid, он возвращает только один результат. А также не закрывается окно. Если я удалю эту опцию, я получаю список идентификаторов (я предполагаю), но также не закрывает какое-либо окно. Что здесь может быть не так? Вот как я искал b=$(xdotool search --class "konsole") – MSO 14 November 2017 в 19:04
  • 2
    Ой! Я пропустил это! Но он возвращает одинаковый идентификатор для всех окон! Что теперь может быть не так? Благодаря!!!! – MSO 14 November 2017 в 19:07
  • 3
    Привет, десерт, это странно, здесь только один PID задан для всех моих окон, даже активных. Я не понимаю! Кроме того, количество PID больше, чем количество открытых консолей. – MSO 14 November 2017 в 19:18
  • 4
    Привет, используя параметр --onlyvisible, он возвращает правильное количество окон. Но все же у всех одинаковый PID – MSO 14 November 2017 в 19:32

Это не работает с Wayland! Если вы используете 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. Прочтите раздел «WINDOW COMMANDS» 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
0
ответ дан 18 July 2018 в 03:19

Это не работает с Wayland! Если вы используете 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. Прочтите раздел «WINDOW COMMANDS» 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
0
ответ дан 24 July 2018 в 17:48

Другие вопросы по тегам:

Похожие вопросы: