Linha de comando do Linux que falhará se qualquer saída padrão for produzida

5

Existe um utilitário simples que eu posso canalizar para o Linux:

  • Retorna um código de sucesso se não houver saída na saída padrão (e / ou erro padrão).
  • Retorna um código de falha se a saída for produzida na saída padrão (e / ou erro padrão).

Para fornecer algum contexto, o comando que estou executando é:

svn mergeinfo --show-revs eligible
http://mysvnserver.example.com/SVF/repos/common/abc/branches/abc-1.7
http://mysvnserver.example.com/SVF/repos/common/abc/trunk

Se houver entradas não mescladas na ramificação, o comando retornará uma lista de números de revisão na saída padrão. Idealmente, o comando adicional do qual estou falando seria:

  • Detectar entradas na saída padrão e retornar uma condição de erro para o Linux.
  • Passe a saída padrão para que ela apareça no terminal. Eu prefiro não suprimir isso.
por David B 06.03.2013 / 12:02

3 respostas

9

Isso é grep que você está procurando:

if svn ... 2>&1 | grep '^'; then
  echo "there was some output"
else
  echo "there wasn't"
fi

Você pode substituir grep '^' por grep . ou grep '[^[:blank:]]' para verificar linhas não vazias ou não em branco (mas isso removerá as vazias / vazias da saída).

(note que o comportamento irá variar entre grep implementações se a entrada contiver dados não textuais como bytes NUL ou linhas muito longas ou não terminadas (o que não aconteceria para svn )).

    
por 06.03.2013 / 13:03
1

Eu não sei de um comando existente ... não é aceitável? Um invólucro? tee a saída para um arquivo e sair com base em se o arquivo está vazio de não?

Abordagem do wrapper, supondo que você ainda queira ver a saída e manter stdout e stderr separados na saída.

#!/bin/bash

TMPFILE=/tmp/allout.$$
TMPPIPE=/tmp/errout.$$
SAVERC=/tmp/saverc.$$

cleanup() {
   [ -p $TMPPIPE ] && rm $TMPPIPE
   [ -f $TMPFILE ] && rm $TMPFILE
}
trap cleanup EXIT

# Set up output/display of std err
[ -p $TMPPIPE ] || mkfifo $TMPPIPE
cat $TMPPIPE | tee -a $TMPFILE1 >&2 &

(eval "$*" 2>$TMPPIPE
echo $? > $SAVERC
) | tee -a $TMPFILE

[ -s $TMPFILE ] && exit 1
exit $(cat $SAVERC)
    
por 06.03.2013 / 12:23
0

Você pode usar wc para contar os caracteres na saída.

$ [ $(ls 2>&1 | wc -c) = "0" ]
$ echo $?
1
$ [ $(echo -n '' 2>&1 | wc -c) = "0" ]
$ echo $?
0

O 2>&1 é necessário para redirecionar o stderr para stdout.

    
por 06.03.2013 / 12:36