Выполнить команду после закрытия окна файлового менеджера (Thunar)

Выполнить команду после закрытия окна файлового менеджера (Thunar)

Я пишу простой скрипт, в котором мне нужно открыть каталог 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 :-)"

Связанный контент