我正在脚本中编译乳胶文件,然后尝试打开一个新的 pdf 阅读器窗口或重新加载当前窗口(llpp 是我的阅读器),所以在编译我的脚本后
pdflatex $FILE_NAME
LLPP_ID=$(pgrep llpp)
if [ $LLPP_ID ]
then
kill -HUP $LLPP_ID
else
llpp $FILE_PATH"/"$FILE_NAME".pdf" &
fi
只要仅打开一个 llpp 窗口,它就会按预期工作。我想修复此问题以适用于任意数量的 llpp 打开窗口。
理想情况下,我会从 bash 脚本中修复进程的 PID,但我知道这是不可能的,因为 PID 是由内核分配的。
我以为我可以使用环境变量,但它们仍可用于子shell,但随后我可以在编译文件、将 PID 存储到环境变量中、关闭终端并在 LLPP 时丢失环境变量的情况下运行windows 仍然打开,但我不知道在哪里可以找到它的 PID 了。
我怎么能这样做呢?
答案1
简单地说,您可以调整逻辑:
- 是否有使用此文件名打开的 llpp 进程?
- 如果是这样,请 HUP 。
- 如果没有,请创建一个。
新代码:
pdflatex "$FILE_NAME"
if ! pkill -HUP -f "llpp ${FILE_PATH}/${FILE_NAME}.pdf"; then
llpp "${FILE_PATH}/${FILE_NAME}.pdf" &
fi
答案2
问题在于对未加引号的$LLPP_ID
变量的测试。当有两个 PID 时,测试将扩展为语法错误(类似于[ 12334 24433 ]
)。
相反,使用-n
测试来测试非空字符串(并始终引用任何变量扩展):
if [ -n "$LLPP_ID" ]; then
但使用以下方法会更容易pkill
:
#!/bin/sh
pdflatex "$filename"
if ! pkill -HUP llpp; then
llpp "$filepath/$filename.pdf" &
fi
这将排版您的文档,发送HUP
到任何正在运行的llpp
实例,无论有一个还是多个,如果没有,则启动一个新实例。
请注意我知道没有什么关于llpp
PDF 阅读器是什么或做什么。