从 bash 脚本开始的文件的“全局存储”PID

从 bash 脚本开始的文件的“全局存储”PID

我正在脚本中编译乳胶文件,然后尝试打开一个新的 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实例,无论有一个还是多个,如果没有,则启动一个新实例。

请注意我知道没有什么关于llppPDF 阅读器是什么或做什么。

相关内容