BASH - Verifique se o pipe não nomeado está vazio

3

Meu problema é que eu quero um script que leia o conteúdo de um canal, verifique se está vazio e imprima se não estiver, como visto aqui:

#!/bin/bash
var=$(cat -)
if [ -n "$var" ]
then
    echo "$var"
else
    echo "Pipe was empty"
fi

O problema é que cat lê de stdin, se o pipe estiver vazio. Existe alguma maneira de impedir que o gato faça isso? Ou o gato é a ferramenta errada para usar aqui?

    
por David Stockinger 27.04.2011 / 03:46

2 respostas

3

Use read -t 0 -N 0 para detectar se os dados estão disponíveis no stdin. Use test -t 0 ou tty para tentar detectar se um pipe está conectado a stdin.

    
por 27.04.2011 / 03:56
1

test -t 0 , não funcionou no meu caso, e as pessoas aqui dizem que é "não-determinístico" ou algo assim. Eu gosto da solução de wc -c (count bytes), agradável e simples. A entrada vazia tem 1 byte, enquanto que um único caractere, por ex. echo "a" | wc -c dá 2

| (read line; if [ $(echo "$line" | wc -c) -gt 1 ]; then echo "$line"; fi) |

Esta saída permanece habilitada para canos, graças aos parênteses em torno de read; if ... Consulte este Q & A

    
por 03.05.2015 / 12:09

Tags