열려 있는 모든 PDF 파일의 전체 경로 이름을 얻는 방법(zathura에서) - rofi와 마찬가지로

열려 있는 모든 PDF 파일의 전체 경로 이름을 얻는 방법(zathura에서) - rofi와 마찬가지로

나는 zathura 뷰어에서 여는 모든 PDF의 전체 경로를 얻으려고 노력하고 있습니다. 을 사용하면 rofi -show window전체 경로를 볼 수 있기 때문에 이것이 가능하다는 것을 알고 있습니다 .

나는 달리기를 시도했다.

ps -p $(pgrep zathura) -o command

그러나 PDF를 열 때 현재 위치에 따라 이름의 일부만 표시됩니다.

Vimtex를 사용하면 상황이 더욱 악화됩니다. 이 경우에는 다음과 같은 내용이 표시됩니다.

zathura -x /usr/bin/nvim --headless -c "VimtexInverseSearch %{line} '%{input}'" --synctex-forward 224:1:/Path/to/part.tex main.pdf

여기서 main.pdf는 part.tex와 같은 위치에 있을 필요가 없습니다(\include 등을 사용하면 이런 일이 발생합니다).

일단 이익을 얻으면 rofi는 올바른 일을 하고 있는 것입니다!

아마도 main.pdf 파일을 찾기 위해 part.tex 파일의 각 상위 디렉토리 내에서 재귀적으로 검색하는 "복잡한" 스크립트를 작성할 수 있을 것입니다.

로피가 어떻게 만들어지는지 아는 사람 있나요? 아니면 더 중요한 것은 어떻게 해야 합니까?


나는 사용하고있다

X11 서버

아치 리눅스, 6.2.8-arch1-1

GNU 배쉬, 버전 5.1.16

루오페이 버전: 1.7.5

자투라 버전 0.5.2

다들 감사 해요.

답변1

다음과 같이 시도해 보세요.

pids=( $(pgrep zathura) )

for p in "${pids[@]}"; do
  mapfile -d '' -t pdfs < <(
    find "/proc/$p/fd/" -lname '*.pdf' -printf '%l\0')

  [ -n "$pdfs" ] && echo "$p: ${pdfs[@]}"
done

먼저 $pids모든 프로세스의 PID를 포함하는 배열()을 만듭니다 zathura.

그런 다음 각 PID에 대해 /proc/PID/fd 디렉토리에서 로 끝나는 심볼릭 링크 대상을 찾고 일치하는 배열( )을 .pdf만듭니다 . $pdfs둘 다 파일 이름 구분 기호로 NUL을 mapfile사용하므로 find모든 파일 이름을 올바르게 처리할 수 있습니다(공백, 줄 바꿈 및 쉘 메타 문자와 같은 성가신 문자가 포함된 파일도 포함).

마지막으로 $pdfs배열이 비어 있지 않으면 PID와 배열을 인쇄합니다. 예를 들어

3289895: /home/cas/Manuals/X399 Taichi.pdf
3290171: /home/cas/Manuals/Define R5 Web-manual V1.2_151013.pdf

참고: 이것은 휴대용이 아닙니다. 이는 Linux에서만 작동합니다(/proc/PID/fd - /proc 의사 파일 시스템은 Linux에만 해당됩니다).


또한 참고 사항: 이는 검색 atril하거나 처리할 때 qpdfview완벽하게 작동 하지만 process 를 검색할 때는 권한 오류로 인해 실패합니다 zathura.

이유는 모르겠지만 내 시스템에서 /proc/PID/fd/atril 및 qpdfview PID에 대한 디렉토리는 소유자가 소유 cas하지만 zathura PID에 대한 fd/ 디렉토리는 루트가 소유하며 루트만 읽을 수 있습니다.

이상한. 이것이 내 시스템(Debian Sid)의 이상한 기능인지 zathura의 이상한 기능인지는 모르겠습니다.

(업데이트: 사실로 밝혀졌습니다 zathura. 다음을 참조하세요.zathura 및 /proc/PID의 파일 소유권)

물론, 내가 대신 sudo find ...에 달리면find프로세스 교체.

sudo그런데 루트로 무엇이든 실행할 수 있도록 이미 구성하지 않은 이상 루트로 무엇 find이든 실행할 수 있도록 사용자 계정을 구성하지 않는 것이 좋습니다. 실행하는 데 사용할 수 있는 조건자가 find있습니다.-exec아무것.

대신 두 개의 매개변수만 필요한 래퍼 스크립트를 작성하세요.

  1. PID 및
  2. -lname조건자가 일치할 인수로 사용하는 패턴입니다.

PID 인수에 숫자만 포함되어 있고 /proc/PID 디렉터리가 속하는지 확인한 다음 $SUDO_USER대부분 find하드코딩된 인수로 실행해야 합니다. sudo사용자가 스크립트를 실행할 수 있도록 구성합니다 .

어쨌든, 그것이 sudo사용되는 방식입니다. 단 한 가지 일만 수행하는 극도로 편집증적인 입력 검사를 사용하여 매우 제한적이고 단일 목적의 래퍼 스크립트를 작성하는 것입니다. 루트로 수행하는 작업이 적을수록 좋습니다.

이것은 매우 독창적인 예입니다. 가장 작다는 뜻이다이론적 인예를 들면,사용하지 마세요신중한 테스트도 없고 이를 "파괴"하려는 진지한 시도도 없습니다. 진지하게, 이 글을 작성하는 데 약 2분이 걸렸으며 신뢰할 수 없습니다. 이는 이 래퍼 스크립트가 깨질 수 있는 모든 가능한 방법을 고려하고 반박하기에 충분한 시간이 아닙니다.

#!/bin/bash

# Arguments:
# $1 PID to examine
# $2 pattern to match -lname (symlink target)
#
# Returns NUL-separated list of matching symlink
# targets found in /proc/$1/fd/

[ "$#" -ne 2 ]       || exit 1  # only two args allowed
[[ $1 =~ ^[0-9]+$ ]] || exit 1  # first arg must be numeric

pdir="/proc/$1"

owner=$(stat --printf '%U' "$pdir")     # GNU stat's printf
[ "$owner" = "$SUDO_USER" ]] || exit 1  # owner must match

find "$pdir/fd/" -lname "$2" -printf '%l\0'

더 멋지게 만들고 싶다면 다양한 오류 조건에 대해 다양한 종료 코드를 사용할 수 있습니다( find실행 시 자체 종료 코드도 갖게 된다는 점을 고려).

답변2

증거와 잘 어울리는 농담이므로 Zatura와 함께 사용할 가치가 있습니다.

lsof 2> /dev/null | grep evince | grep pdf$ | awk '{print $NF}' | uniq
/home/ron/165_dollar_checks.pdf
/home/ron/12_mnt_exh_05_box.pdf

관련 정보