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