xdg-openは、生成されたプロセスが終了するまでブロックします。

xdg-openは、生成されたプロセスが終了するまでブロックします。

見たい文書が多すぎて一つずつ見たいのですが、前の文書を閉じると次の文書も開きます。

証拠を持ってこのようなことをしたことがあります。

for i in `ls | grep .pdf`; do evince $i; done

しかし、xdg-openはevinceのようにブロックされないため、xdg-openで同じ操作を実行すると失敗します。

xdg-openを使用して同じforループを実行して開いているアプリケーションを閉じるときにforループの次の反復を実行する方法はありますか?

ベストアンサー1

きちんとした方法が見つからないので、回避策は次のとおりです。各ファイルを開き、「一致」プロセスが終了するのを待つ忙しいループを実行します。また、forlsを解析し、ファイル名パラメータを引用しないようにループを更新しました。

#!/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秒未満のスリープモードに切り替えたり、まったく:待たないことがあります。

おすすめ記事