使用entr运行多个命令

时间:2021-06-02 15:47:12

标签: bash shell groff

我正在尝试使用“entr”命令来自动编译 Groff 文档。

我希望运行以下行:

refer references.bib $1 | groff -ms $1 -T pdf > $2

遗憾的是,如果我尝试这样做,它只会编译一次:

echo $1 | entr refer references.bib $1 | groff -ms $1 -T pdf > $2

我也尝试了以下方法,但它创建了一个无法用 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

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

1 个答案:

答案 0 :(得分:2)

我没有尝试这个,因为我不想安装 entr。但我认为以下应该有效:

echo "$1" | entr sh -c "refer references.bib $1 | groff -ms $1 -T pdf > $2"

请注意,我们在 shell 中运行管道 refer | groff 以将其组合在一起。没有 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"