見たい文書が多すぎて一つずつ見たいのですが、前の文書を閉じると次の文書も開きます。
証拠を持ってこのようなことをしたことがあります。
for i in `ls | grep .pdf`; do evince $i; done
しかし、xdg-openはevinceのようにブロックされないため、xdg-openで同じ操作を実行すると失敗します。
xdg-openを使用して同じforループを実行して開いているアプリケーションを閉じるときにforループの次の反復を実行する方法はありますか?
答え1
きちんとした方法が見つからないので、回避策は次のとおりです。各ファイルを開き、「一致」プロセスが終了するのを待つ忙しいループを実行します。また、for
lsを解析し、ファイル名パラメータを引用しないようにループを更新しました。
#!/bin/bash
for i in *.pdf
do
xdg-open "$i"
t=$(tty)
t=${t##/dev/}
s=$(ps -o session= -p $$)
while pgrep -f "$i" --terminal "$t" --uid "$(id -u)" --session "$s" >/dev/null 2>&1
do
sleep 1
done
done
これは、xdg-openがファイルを開くと仮定します。プロセスはデスクトップ環境によって分岐され、制御はスクリプトに返されます。その後、スクリプトは、tty、セッション、および現在のユーザーIDを収集し、pgrep
次の基準に一致するプロセスを見つけるように要求します。
- ループのファイル名を含むフルプロセス名
- 関連端末は、私たちが実行している端末です。
- プロセスのUIDは私たちのUIDと一致します。
- プロセスセッションは私たちのセッションと一致します。
...これらの操作はすべて、xdg-openによって開始された対応するプロセスのみをキャプチャするために行われます。
プロセスがもう存在しない場合は、for
次のファイルで繰り返し実行されます。
1秒の遅延が長すぎる場合(Linuxでは)、1秒未満のスリープモードに切り替えたり、まったく:
待たないことがあります。