Salva o número de linhas de saída para uma variável em um script de shell sem consumir a saída

1

Eu tenho um script de shell onde eu tenho uma declaração if baseada fora do número de saídas de saída de outra chamada. (No meu caso, faz algo que há mais que 1 linha de saída).

LINES=$(function_call | wc -l)
if [ "$LINES" -gt 1 ]
  then
    do_stuff
fi

O que eu gostaria, no entanto, é não consumir a saída (ou seja, ainda tem que aparecer em stdout), mas ainda tem o script fazer a mesma coisa.

    
por Chris 19.04.2016 / 17:13

1 resposta

4

Use tee (aqui assumindo um sistema com suporte para /dev/fd/<n> ):

{ 
  lines=$(function_call 3>&- | tee -a /dev/fd/3 | wc -l)
} 3>&1
if [ "$lines" -gt 1 ];  then
  do_stuff
fi

No Linux que tem uma implementação ímpar de /dev/fd/<n> , se o stdout for redirecionado para um arquivo, a saída será inserida no final desse arquivo, mesmo se a posição atual do stdout no arquivo O script nesse arquivo não está no final (em geral, isso seria OK, já que é raro que o stdout esteja dentro de um arquivo).

Alternativamente, você poderia fazer

{ 
  lines=$(function_call 3>&- | sed -ne 'w /dev/fd/3' -e '$=')
} 3>&1

Ou:

{ 
  lines=$(function_call 3>&- | awk '{print > "/dev/fd/3"}; END {print NR}')
} 3>&1

(lembre-se de que, dependendo da implementação de sed ou awk , ele pode fornecer mais de wc -l se function_call fornecer dados extras após o último caractere de nova linha).

    
por 19.04.2016 / 17:51