2

Я делаю bash-скрипт для Linux, который закрывает окно терминала, если окно теряет фокус.

В командной строке я смог сделать это:

termwin=$(xdotool getactivewindow)

while : 
do 
  if [[ $(xdotool getactivewindow) != $termwin ]]
  then 
    exit 
  fi 
done

Он работает набранным вручную в терминале, но, если я помещаю его в скрипт, вместо закрытия окна, когда фокус теряется, скрипт просто останавливается. Нет ошибок или чего-то еще, просто вернитесь к подсказке.

Я чувствую, что мне не хватает чего-то простого.

РЕДАКТИРОВАТЬ

Прочитав это ...:смотрите здесь

Я попытался запустить это как ". Test.sh", а не "./test.sh", и это сработало. Ссылка описывает разницу в этих методах как запуск сценария как подпроцесса или как часть основного процесса, соответственно. Может кто-нибудь просто объяснить это и / или изменить сценарий для успешной работы с "./" вместо ".", В последнем случае возникают проблемы?

2 ответа2

1

Когда вы поставляете файл с . , команды будут выполняться так же, как если бы вы ввели их в командной строке. Таким образом, exit завершит работу вашей запущенной оболочки.

Чтобы выйти из оболочки, из которой скрипт выполнялся при разветвлении, вам нужно получить идентификатор процесса родительского процесса. Вы можете попробовать запустить

kill ${PPID}

в сценарии вместо exit убить родительскую оболочку (совет: сначала попробуйте повторить pid и проверьте, какому процессу он соответствует, чтобы вы не убили свой WM или что-то в этом роде).

Если ${PPID} не делает этого за вас, вы также можете попробовать отправить pid в качестве параметра в сценарий, но это зависит от того, как и где он вызывается.


Вы сказали, что использовали urxtvd/urxvtc . При таком сочетании этот скрипт убивает терминал, с которого он был запущен:

#!/bin/sh
echo kill in 3
sleep 3
kill -1 ${PPID}

таким образом, вы должны иметь возможность использовать kill -1 таким образом, чтобы уничтожить один экземпляр urxvtc .

Обратите внимание, что если вы запустите это с помощью источника, то для экземпляра urxvtd будет $PPID для текущего работающего терминала, и все терминалы умрут. Вы этого не хотите.

0

Надеюсь, что скрипт будет работать по мере необходимости:

#!/bin/sh

termwin=$(xdotool getactivewindow)
while : ; do
    [ $(xdotool getwindowfocus) = $termwin ] || kill -9 $PPID
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .