我正在編寫一個簡單的腳本,我需要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 :-)"