![xdg-open은 생성된 프로세스가 종료될 때까지 차단합니다.](https://linux55.com/image/128943/xdg-open%EC%9D%80%20%EC%83%9D%EC%84%B1%EB%90%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%80%20%EC%A2%85%EB%A3%8C%EB%90%A0%20%EB%95%8C%EA%B9%8C%EC%A7%80%20%EC%B0%A8%EB%8B%A8%ED%95%A9%EB%8B%88%EB%8B%A4..png)
보고 싶은 문서가 너무 많아서 하나씩 보고 싶은데, 이전 문서를 닫으면 다음 문서도 열립니다.
증거를 가지고 이런 짓을 한 적이 있어요
for i in `ls | grep .pdf`; do evince $i; done
그러나 xdg-open은 evince처럼 차단되지 않기 때문에 xdg-open으로 동일한 작업을 수행하면 실패합니다.
xdg-open을 사용하여 동일한 for 루프를 실행하여 열려 있는 응용 프로그램을 닫을 때 for 루프의 다음 반복이 실행되도록 하는 방법이 있습니까?
답변1
깔끔한 방법을 찾을 수 없으므로 해결 방법은 다음과 같습니다. 각 파일을 연 다음 "the" 일치 프로세스가 종료될 때까지 기다리는 바쁜 루프를 실행합니다. 또한 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초 미만의 절전 모드로 바꾸거나 전혀 :
기다리지 않을 수 있습니다.