ファイルマネージャ(Thunar)ウィンドウが閉じられた後にコマンドを実行する

ファイルマネージャ(Thunar)ウィンドウが閉じられた後にコマンドを実行する

私はThunarでディレクトリを開きdirname、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 プロセスをオフにせずに問題を解決したいと思います。

[単独で]を使用するのは難しいようですが、 (ウィンドウ ID)pidがあり、 (スマート ロジックと組み合わせて) を介して見つけることができます。シェル スクリプトでそれをチェックし (ループ内で繰り返し)、 がなくなったらディレクトリを削除できます。widwmctrl -lpwid

次のシェルスクリプトは、その実行方法を示しています。質問で指定された問題を解決する以外にアクションはないため、これはデモ スクリプトにすぎません。

#!/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 :-)"

関連情報