我想检查命令的输出是否包含“重新运行”(然后重新运行),但我也想显示整个输出。我知道我可以使用其中之一:
command | tee >(grep rerun)
command | grep rerun
第一个按预期打印整个输出,但我不能将其用作条件,因为它始终返回 0。第二个仅打印包含 rerun 的行,但如果不匹配则返回 1。
我的使用示例:
while pdflatex paper.tex | grep -E "rerun LaTeX|run Biber"; do
biber paper
done
此处提供的答案也没有帮助,因为 grep 总是返回 0。
答案1
只需使用
command | tee outfile | grep rerun
或者
while pdflatex paper.tex | tee outfile | grep -E "rerun LaTeX|run Biber"; do
您可以检查 grep 命令的状态,稍后可以查看文件“output”。
答案2
您可以查看一个文件并对该文件执行 grep 。然后你可以使用 grep 退出代码(0 表示匹配):
RERUN=1
while [[ $RERUN == 1 ]] ; do
biber paper
! pdflatex paper.tex | tee output.txt && grep -E -q "rerun LaTeX|run Biber" output.txt
RERUN=$?
done
第 4行!
反转 grep 进程的退出代码,因为 grep 在找到匹配时返回 0,在没有匹配时返回 1,请参阅grep 手册页:
退出状态
Normally the exit status is 0 if a line is selected, 1 if no lines were selected, and 2 if an error occurred. However, if the -q or --quiet or --silent is used and a line is selected, the exit status is 0 even if an error occurred.
第 5 行将最后一个退出代码 ( $?
) 放入循环条件中使用的 RERUN 变量中。
我还-q
向 grep 添加了不写入标准输出的选项
答案3
如果我们坚持stdout
立即显示,那么grep
Process Substitution 中的输出应该重定向到一个文件,以免输出中出现重复的行,因此您必须这样做command | tee >(grep rerun >/tmp/my.log)
:
一旦生成了文件,您所要做的就是将[[ -s /tmp/my.log ]]
其用作重新运行条件。