私は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サーバー
Arch Linux、6.2.8-arch1-1
GNUバッシュ、バージョン5.1.16
Luopeのバージョン:1.7.5
Zaturaバージョン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 /ディレクトリはrootが所有し、rootのみを読み取ることができます。
奇妙な。これが私のシステム(Debian Sid)の奇妙な機能なのか、zathuraの奇妙な機能なのかわかりません。
(更新:事実がわかりましたzathura
。以下を参照してください。)zathuraおよび/proc/PIDのファイル所有権)
もちろん、私が代わりsudo find ...
に走った場合find
プロセスの交換。
sudo
ちなみに、root で何でも実行できるように、すでに設定していない限り、root で何でもfind
実行できるようにユーザ アカウントを設定しないことをお勧めします。実行に使用できる述語がfind
あります。-exec
何もない。
代わりに、2つのパラメータのみを必要とするラッパースクリプトを作成してください。
- PIDと
-lname
述語が一致する引数として使用するパターン。
PID引数に数字のみが含まれており、/ proc / PIDディレクトリが属していることを確認してから、ほとんどの場合、$SUDO_USER
ハードfind
コーディングされた引数として実行する必要があります。sudo
ユーザーがスクリプトを実行できるように設定します。
とにかく、それがsudo
使用される方法です。 1つのことだけを行う非常に編集可能な入力チェックを使用して、非常に限られた単一目的のラッパースクリプトを作成することです。ルートで行う作業が少ないほど良いです。
これは非常に独創的な例です。最も小さいという意味です。理論的例えば、使用しないでください慎重なテストもなく、それを「破壊」しようとする真剣な試みもありません。真剣に、この記事を書くのに約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
証拠とよく合う冗談なので、ザトゥラと一緒に使う価値があります。
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