Я открыл PDF-файл с помощью средства просмотра документов из графического интерфейса. Есть ли способ получить путь к этому файлу в терминале / скрипте?
Другой подход будет похож на
$ for ip in $(pgrep -x evince); do lsof -F +p $ip | grep -oP '^n\K.*\.pdf$'; done
/home/terdon/file1.pdf
/home/terdon/file2.pdf
В общем, всякий раз, когда вы хотите искать процесс, pgrep лучше, чем ps -ef | grep process, поскольку последний также будет соответствовать самому процессу grep. Например:
$ ps -ef | grep emacs
terdon 6647 6424 23 16:26 pts/14 00:00:02 emacs
terdon 6813 6424 0 16:26 pts/14 00:00:00 grep --color emacs
$ pgrep emacs
6647
Параметр -x возвращает только процессы, чье имя совпадает с переданной строкой. Это необходимо, потому что evince также запускает демон (evinced), который также будет сопоставляться без -x (-l должен печатать имя, а также PID):
$ pgrep -l evince
4606 evince
4611 evinced
4613 evince
$ pgrep -lx evince
4606 evince
4613 evince
] Таким образом, цикл for будет запускать lsof на каждом из PID, возвращаемых pgrep. Затем они проходят через grep. Опция -o означает «распечатать только согласованную часть строки», а -P активирует регулярные выражения, совместимые с Perl, что позволяет нам использовать \K. В PCREs \K означает «отбросить все, что было согласовано до \K ". In other words, since I am using -o , it will match lines beginning with n and ending with .pdf but it will not print the matched n`. В результате печатается только имя файла.
Вам не нужно указывать даже имя файла pdf, открытое через Document Viewer. Эта команда будет отображать пути всех файлов PDF, открытых через Document Viewer. [F3] является фактической командой для открытия Document Viewer через терминал.
ps -ef | grep evince | sed -n '/.*\.pdf/p' | sed 's/.*evince \(.*\)$/\1/g'
Пример:
$ ps -ef | grep evince | sed -n '/.*\.pdf/p' | sed 's/.*evince \(.*\)$/\1/g'
/media/avinash/C68C57908C5779BF/pdf/PHP/PHP-Manual.pdf
/media/avinash/C68C57908C5779BF/pdf/python.pdf
Но все кредиты идут на @Corp.