我正在编写一个简单的脚本,我需要dirname
使用 Thunar 打开一个目录,并在关闭 Thunar 窗口后删除该目录。我期待类似的事情
thunar $dirname && rm -r $dirname
上班。
问题是该thunar
进程在启动后似乎没有保持与终端的连接:运行后thunar $dirname
,shell 直接转到下一个命令,而不是等待窗口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
(窗口ID),可以通过wmctrl -lp
(结合一些智能逻辑)找到。让 shellscript 检查它(在循环中重复),当它wid
消失时,您可以删除该目录。
以下 shell 脚本展示了如何完成它。它只是一个演示脚本,因为除了解决问题中指定的问题之外没有其他操作。
#!/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 :-)"