在Makefile中启动和关闭应用程序

在Makefile中启动和关闭应用程序,makefile,Makefile,我使用Makefile来编译latex。在编译过程的最后,我有以下规则 $(PDFREADER) $(SOURCE).pdf & 它将在哪里打开以显示新创建的pdf 我想要的是,下一次编译pdf时,Makefile将关闭当前的evince进程,并在上一次编译过程中打开 我读了很多文章,但我不知道怎么做 有什么帮助吗 谢谢 编辑这是我使用的生成文件 SOURCE=PEI PDFREADER=evince EXTENSIONS=ps dvi log out toc aux bbl blg

我使用Makefile来编译latex。在编译过程的最后,我有以下规则

$(PDFREADER) $(SOURCE).pdf &
它将在哪里打开以显示新创建的pdf

我想要的是,下一次编译pdf时,Makefile将关闭当前的evince进程,并在上一次编译过程中打开

我读了很多文章,但我不知道怎么做

有什么帮助吗

谢谢

编辑这是我使用的生成文件

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 ./*~

一旦启动流程,就必须将流程id(pid)存储到一个文件中,我将其称为
evince.pid
。因此,请将您的线路改为:

$(PDFREADER) $(SOURCE).pdf & echo $$! > evince.PID
这将pid保存在
evince.pid
文件中。要停止前一个进程,只需从该文件中读取pid(如果存在)并终止相应的进程。要执行此操作,请添加到makefile:

if [ -a evince.PID ]; then \
    kill -TERM $$(cat evince.PID) || true; \
fi;
对于将来的makefile/bash编写,请注意:

  • $$
    对应于bash变量
    $,因为makefile语法还使用
    $
    指示变量。为了消除bash变量的歧义,我们需要一个双精度
    $
  • $$(cat evince.PID)
    将文件读入一个bash变量,该变量再次标记为
    $
  • kill-TERM
    如果进程不存在,则返回非0退出代码(例如,您已经手动将其终止)。使用
    | | true
    时,即使kill失败,也会返回0退出代码,因此失败的kill不会导致生成文件失败
编辑:
糟糕的是,我发现检查文件是否存在的
-a
现在已经被弃用,应该避免使用
-e
。Debian Almquist shell(
dash
)似乎对此有点挑剔。要终止进程,请使用:

if [ -e evince.PID ]; then \
    kill -TERM $$(cat evince.PID) || true; \
fi;

一旦启动流程,就必须将流程id(pid)存储到一个文件中,我将其称为
evince.pid
。因此,请将您的线路改为:

$(PDFREADER) $(SOURCE).pdf & echo $$! > evince.PID
这将pid保存在
evince.pid
文件中。要停止前一个进程,只需从该文件中读取pid(如果存在)并终止相应的进程。要执行此操作,请添加到makefile:

if [ -a evince.PID ]; then \
    kill -TERM $$(cat evince.PID) || true; \
fi;
对于将来的makefile/bash编写,请注意:

  • $$
    对应于bash变量
    $,因为makefile语法还使用
    $
    指示变量。为了消除bash变量的歧义,我们需要一个双精度
    $
  • $$(cat evince.PID)
    将文件读入一个bash变量,该变量再次标记为
    $
  • kill-TERM
    如果进程不存在,则返回非0退出代码(例如,您已经手动将其终止)。使用
    | | true
    时,即使kill失败,也会返回0退出代码,因此失败的kill不会导致生成文件失败
编辑:
糟糕的是,我发现检查文件是否存在的
-a
现在已经被弃用,应该避免使用
-e
。Debian Almquist shell(
dash
)似乎对此有点挑剔。要终止进程,请使用:

if [ -e evince.PID ]; then \
    kill -TERM $$(cat evince.PID) || true; \
fi;

你有什么问题吗?您是否尝试在配方中添加适当的
echo
位?您对这些答案有什么疑问?您是否尝试在配方中添加适当的
echo
位?解释很好,但出于某种原因,我得到
/bin/sh:1:[:-a:意外运算符
我将其放在编译pdfIt的规则中。您能生成一个简单的生成文件来重现问题并将其添加到您的问题中吗?@Camandros我编辑了我的答案以解决
/bin/sh:1:[:-a:意外的运算符
错误。
-a
现在已被弃用,应替换为
-e
。奇怪的是,只有使用
破折号
shell运行make才会触发错误。解释很好,但出于某种原因,我得到了
/bin/sh:1:[:-a:意外运算符
我将其放在编译pdfIt的规则中。您能生成一个简单的生成文件来重现问题并将其添加到您的问题中吗?@Camandros我编辑了我的答案以解决
/bin/sh:1:[:-a:意外的运算符
错误。
-a
现在已被弃用,应替换为
-e
。奇怪的是,只有使用
破折号
shell运行make才会触发错误。