Apenas use
command | tee outfile | grep rerun
ou
while pdflatex paper.tex | tee outfile | grep -E "rerun LaTeX|run Biber"; do
Você pode verificar o status do comando grep e depois pode ver o arquivo "output".
Eu quero verificar se a saída do meu comando contém "rerun" (e, em seguida, execute novamente), mas também quero exibir toda a saída. Eu sei que eu poderia usar um destes:
command | tee >(grep rerun)
command | grep rerun
O primeiro imprime toda a saída como esperado, mas não posso usá-la como condição porque ela sempre retorna 0. A segunda imprime apenas as linhas que contêm reexecução, mas retorna 1 se não houver correspondência. / p>
Meu exemplo de uso:
while pdflatex paper.tex | grep -E "rerun LaTeX|run Biber"; do
biber paper
done
As respostas fornecidas aqui também não ajudam, pois o grep sempre retorna 0.
Apenas use
command | tee outfile | grep rerun
ou
while pdflatex paper.tex | tee outfile | grep -E "rerun LaTeX|run Biber"; do
Você pode verificar o status do comando grep e depois pode ver o arquivo "output".
você pode tee para um arquivo e executar o grep no arquivo. Então você pode usar o código de saída do grep (0 quando houver uma partida):
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
O !
na quarta linha inverte o código de saída do processo grep porque o grep retorna 0 quando ele encontra uma correspondência e 1 quando não corresponde, veja o página do manual do grep :
EXIT STATUS
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.
A quinta linha coloca o último código de saída ( $?
) no RERUN var que é usado na condição de loop.
Eu também adicionei a opção -q
ao grep para não gravar no stdout