xdg-open은 생성된 프로세스가 종료될 때까지 차단합니다.

xdg-open은 생성된 프로세스가 종료될 때까지 차단합니다.

보고 싶은 문서가 너무 많아서 하나씩 보고 싶은데, 이전 문서를 닫으면 다음 문서도 열립니다.

증거를 가지고 이런 짓을 한 적이 있어요

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

그러나 xdg-open은 evince처럼 차단되지 않기 때문에 xdg-open으로 동일한 작업을 수행하면 실패합니다.

xdg-open을 사용하여 동일한 for 루프를 실행하여 열려 있는 응용 프로그램을 닫을 때 for 루프의 다음 반복이 실행되도록 하는 방법이 있습니까?

답변1

깔끔한 방법을 찾을 수 없으므로 해결 방법은 다음과 같습니다. 각 파일을 연 다음 "the" 일치 프로세스가 종료될 때까지 기다리는 바쁜 루프를 실행합니다. 또한 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초 미만의 절전 모드로 바꾸거나 전혀 :기다리지 않을 수 있습니다.

관련 정보