我使用 Makefile 来编译乳胶。在编译过程结束时,我有以下规则
$(PDFREADER) $(SOURCE).pdf &
Run Code Online (Sandbox Code Playgroud)
它会打开了Evince新创建的PDF文件。
我想要的是下次编译 pdf 时,Makefile 关闭当前的evince进程,在之前的编译过程中打开。
有什么帮助吗?
谢谢
编辑这是我使用的makefile
SOURCE=PEI
PDFREADER=evince
EXTENSIONS=ps dvi log out toc aux bbl blg idx glg glo ist lof acn ilg ind ist lot xdy synctex.gz glsdefs
$(SOURCE).pdf: $(SOURCE).tex bibliografia.bib
if [ -a evince.PID ]; then \
kill -TERM $$(cat evince.PID) || true; \
fi;
pdflatex -shell-escape $(SOURCE).tex
bibtex $(SOURCE)
pdflatex -shell-escape $(SOURCE).tex
pdflatex -shell-escape $(SOURCE).tex
vis: $(SOURCE).pdf
$(PDFREADER) $(SOURCE).pdf & echo $$! > evince.PID
clean: organized
@rm -f $(SOURCE).pdf
organized:
@rm -f $(foreach postfix, $(EXTENSIONS), $(SOURCE).$(postfix))
@rm -f ./*~
@cd ./tex && rm -rf $(foreach postfix, $(EXTENSIONS), *.$(postfix)) && rm -f ./*~
Run Code Online (Sandbox Code Playgroud)
一旦你开始你的进程,你必须将进程 id (pid) 存储到一个文件中,让我称之为evince.PID. 所以改变你的行:
$(PDFREADER) $(SOURCE).pdf & echo $$! > evince.PID
Run Code Online (Sandbox Code Playgroud)
这会将 pid 保存在evince.PID文件中。要停止前一个进程,只需从该文件(如果存在)中读取 pid 并终止相应的进程。为此,请添加到您的 makefile:
if [ -a evince.PID ]; then \
kill -TERM $$(cat evince.PID) || true; \
fi;
Run Code Online (Sandbox Code Playgroud)
对于未来的 makefile/bash 编写注意:
$$!对应于 bash 变量$!,因为 makefile 语法也指示变量,$以消除 bash 变量的歧义,我们需要一个 double$$$$(cat evince.PID) 将文件读入一个 bash 变量,再次标记为 $$kill -TERM如果进程不存在,则返回非 0 退出代码(例如,您已经手动杀死了它)。随着|| true一个0退出代码返回即使杀失败,所以杀失败不会导致生成文件失败编辑:
我的错,我发现-a检查文件是否存在现在已被弃用,应该避免使用-e. Debian Almquist shell ( dash) 似乎对此有点挑剔。要终止进程,请使用:
if [ -e evince.PID ]; then \
kill -TERM $$(cat evince.PID) || true; \
fi;
Run Code Online (Sandbox Code Playgroud)