Bash/xdotool: команды работают, но не в скрипте

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

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

termwin=$(xdotool getactivewindow)

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

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

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

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

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

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

2 ответа

Решение

Когда вы поставляете файл с ., команды будут выполняться так же, как если бы вы ввели их в командной строке. таким образом 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 для текущего работающего терминала, и все терминалы умрут. Вы этого не хотите.

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

#!/bin/sh

termwin=$(xdotool getactivewindow)
while : ; do
    [ $(xdotool getwindowfocus) = $termwin ] || kill -9 $PPID
done
Другие вопросы по тегам