使用 entr 运行多个命令

Eid*_*lon 5 bash shell groff

我正在尝试使用“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)

这样做的正确方法是什么?

Soc*_*owi 7

我没有尝试这个,因为我不想安装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)