Я пишу простой скрипт, в котором мне нужно открыть каталог dirname
с Thunar и удалить этот каталог после закрытия окна Thunar. Я ожидал что-то вроде
thunar $dirname && rm -r $dirname
работать.
Проблема в том, что thunar
процесс, похоже, не остается подключенным к терминалу после запуска: после запуска thunar $dirname
оболочка переходит непосредственно к следующей команде, а не ждет thunar
закрытия окна. Как это обойти?
решение1
Процесс Thunar уже запущен с опцией "--daemon", поэтому любой новый вызов Thunar будет использовать эту опцию, и ваша попытка запустить новый процесс Thunar не удастся, и rm немедленно запустится. Обратите внимание, что сам "Thunar --daemon" делаетнетоткрыть окно Thunar.
Процесс демона обычно запускается при входе в систему по определению в /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-session.xml ("/etc", а не "~"). Удаление флага "--daemon" повлияет на существующие скрипты, которые не ожидают закрытия Thunar, и заблокирует вашу командную строку, если вы запустите Thunar оттуда.
Вы можете «убить» демон Thunar перед соответствующей строкой скрипта с помощью Thunar -q
, запустить строку и перезапустить демон с помощью Thunar --daemon &
после нее - помните о том, что &
в конце нужно запустить демон в фоновом режиме, в противном случае ваш скрипт будет ждать его завершения).Предостережение:все окна Thunar, которые были открыты «на» демоне Thunar, которого вы «убили», исчезнут без уведомления.
Так что ваша полная строка может быть такой:
Thunar -q && thunar $dirname && rm -r $dirname && Thunar --daemon &
Вы можете взглянуть наСтраница руководства Thunar
решение2
Когда уже запущен процесс Thunar (менеджер рабочего стола или другое окно), новое окно Thunar будет отсоединено от вызывающего процесса и будет запущена следующая команда, а для конкретного окна нет pid
. Это хорошо описано в ответе hh skladby.
Я хочу решить проблему, не отключая уже запущенный процесс Thunar.
Кажется, сложно использовать pid
[отдельно], но есть wid
(Window ID), который можно найти через wmctrl -lp
(в сочетании с какой-нибудь умной логикой). Пусть скрипт оболочки проверит его (повторно в цикле), и когда он wid
исчезнет, вы можете удалить каталог.
Следующий скрипт оболочки показывает, как это можно сделать. Это всего лишь демонстрационный скрипт, поскольку нет никаких других действий, кроме решения проблемы, указанной в вопросе.
#!/bin/bash
if [ "$1" == "" ]
then
echo "No directory on command line"
dirname="MyDir"
else
dirname="$1"
fi
mkdir -p "$dirname"
if [ $? -ne 0 ]
then
echo "Bad directory name, try again"
exit 1
fi
thunar "$dirname"
pid=$(ps -e | grep -i thunar | sed -e 's/ *//' -e 's/ .*//')
#echo "$pid"
sleep 1
wid=$(wmctrl -lp | grep " $pid " | grep "${dirname##*/}" | tail -n1)
wid=$(echo "$wid" | tee /dev/stderr | sed 's/ .*//')
#echo "$wid"
echo "Waiting for you to close the Thunar window '${dirname##*/}' ..."
while wmctrl -lp | grep "$wid" > /dev/null
do
sleep 1
done
rm -r "$dirname"
echo "Done :-)"