我正在尝试使用“entr”命令自动编译 Groff 文档。
我希望运行以下行:
refer references.bib $1 | groff -ms $1 -T pdf > $2
Run Code Online (Sandbox Code Playgroud)
遗憾的是,如果我尝试这样做,它只会编译一次:
echo $1 | entr refer references.bib $1 | groff -ms $1 -T pdf > $2
Run Code Online (Sandbox Code Playgroud)
我也尝试过以下操作,但它创建了一个无法用Ctrl+退出的无限循环C:
compile(){
refer references.bib $1 | groff -ms $1 -T pdf > $2
}
while true; do
compile $1 $2
echo $1 | entr -pd -s 'kill $PPID'
done
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
我没有尝试这个,因为我不想安装entr。但我认为以下应该有效:
echo "$1" | entr sh -c "refer references.bib $1 | groff -ms $1 -T pdf > $2"
Run Code Online (Sandbox Code Playgroud)
refer | groff请注意,我们在 shell 中运行管道以将其分组在一起。您的问题中没有 shell 的命令refer在文件更改时运行,但groff仅运行一次。该entr ... | groff部分groff不是由 执行entr,而是由bash并行执行。
$1仅当且不$2包含空格、*或 等特殊符号时,此命令才有效$。处理这些争论的正确方法是......
echo "$1" | entr sh -c 'refer references.bib "$1" | groff -ms "$1" -T pdf > "$2"' . "$1" "$2"
Run Code Online (Sandbox Code Playgroud)