Ich schreibe ein einfaches Skript, in dem ich ein Verzeichnis dirname
mit Thunar öffnen und dieses Verzeichnis nach dem Schließen des Thunar-Fensters löschen muss. Ich habe etwas erwartet wie
thunar $dirname && rm -r $dirname
arbeiten.
Das Problem ist, dass der thunar
Prozess nach dem Start nicht mit dem Terminal verbunden zu bleiben scheint: Nach dem Ausführen thunar $dirname
geht die Shell direkt zum nächsten Befehl, anstatt zu warten, bis das thunar
Fenster geschlossen wird. Wie kann ich das umgehen?
Antwort1
Es läuft bereits ein Thunar-Prozess mit der Option „--daemon“, sodass jeder neue Thunar-Aufruf diesen verwendet und Ihr Versuch, einen neuen Thunar-Prozess zu starten, fehlschlägt und rm sofort ausgeführt wird. Beachten Sie, dass „Thunar --daemon“ selbstnichtöffne ein Thunar-Fenster.
Der Daemon-Prozess wird normalerweise per Definition in /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-session.xml ("/etc", nicht "~") beim Login gestartet. Das Entfernen des Flags "--daemon" dort wirkt sich auf vorhandene Skripte aus, die nicht darauf warten, dass Thunar geschlossen wird, und blockiert Ihre Befehlszeile, wenn Sie Thunar von dort aus starten.
Sie können den Thunar-Daemon vor Ihrer entsprechenden Skriptzeile mit „beenden“ Thunar -q
, die Zeile ausführen und den Daemon Thunar --daemon &
danach mit neu starten (achten Sie auf das &
am Ende, um den Daemon im Hintergrund zu starten, da Ihr Skript andernfalls auf die Beendigung wartet).Vorbehalt:Alle Thunar-Fenster, die „auf“ dem von Ihnen „gekillten“ Thunar-Daemon geöffnet waren, verschwinden ohne Vorankündigung.
Ihre vollständige Zeile könnte also lauten:
Thunar -q && thunar $dirname && rm -r $dirname && Thunar --daemon &
Schauen Sie sich doch mal anThunars Manpage
Antwort2
Wenn bereits ein Thunar-Prozess ausgeführt wird (Desktop-Manager oder ein anderes Fenster), wird ein neues Thunar-Fenster vom aufrufenden Prozess abgetrennt und der nächste Befehl gestartet, und es gibt kein pid
für ein bestimmtes Fenster. Dies wird in der Antwort von hh skladby gut beschrieben.
Ich möchte das Problem lösen, ohne den bereits gestarteten Thunar-Prozess zu beenden.
Es scheint schwierig, [allein] zu verwenden pid
, aber es gibt eine (Fenster-ID), die (in Kombination mit einer intelligenten Logik) wid
gefunden werden kann . Lassen Sie das Shellskript danach suchen (mehrfach in einer Schleife) und wenn das weg ist, können Sie das Verzeichnis entfernen.wmctrl -lp
wid
Das folgende Shellskript zeigt, wie es geht. Es ist nur ein Demoskript, da es keine andere Aktion als die Lösung des in der Frage angegebenen Problems beinhaltet.
#!/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 :-)"