Como posso me sentar em um fluxo sem atrapalhar, capturando e testando?

3

Como posso testar se a saída de um comando é uma string vazia, embora não  interferindo com buffering? Exemplo:

command | ???
if [ $? = 0 ] && [ -n "$output_from_command"]; then
   ...

Eu quero que a saída do código acima seja a mesma de quando estiver executando command .

    
por Ernest A 23.12.2013 / 21:16

3 respostas

3

Você pode usar o comando tee , que aceita entrada de stdin e grava a saída em stdout mais um arquivo.

command | (umask 077; exec tee "/tmp/out.$$")

Então você pode test -s "/tmp/out.$$" para ver se é de comprimento zero ou não. (Observe que $$ se expande para o pid atual, o que ajuda a evitar processos semelhantes que se sobrescrevem. Você pode preferir usar mktemp , quando disponível, para evitar problemas em que um invasor adivinha o nome do arquivo e criar um symlink em seu lugar)

    
por 23.12.2013 / 21:34
1

Isso parece funcionar:

#!/bin/bash

OUTPUT="$(echo "foo")"  # replace 'echo "foo"' with your command

if [[ -z "$OUTPUT" ]]; then
   echo "No output."
else
   echo "$OUTPUT"
fi
    
por 23.12.2013 / 21:53
1
if the-command | grep '^'; then
  echo the-command output was not empty
fi

(observe que o comportamento irá variar entre grep implementações se a saída de the-command não for texto (contém caracteres NUL, não termina em um caractere de nova linha ou possui linhas anormalmente longas).

Para verificar também o status de saída de the-command , você pode usar a opção pipefail disponível em um número de shells (bash, ksh93, zsh, yash, mksh, pelo menos):

if (set -o pipefail; the-command | grep '^'); then
  echo the-command was successful and its output was not empty
fi

Para trabalhar com dados que não são de texto, você pode substituir grep '^' por:

PERLIO=:unix perl -pe 'BEGIN{$/=536} END{exit!$.}'

Note que alguns comandos mudam seu comportamento de saída quando sua stdout não é um dispositivo terminal (aqui alterado para um pipe), então isso ainda poderia ter um efeito na saída.

    
por 23.12.2013 / 23:09