Não há como dar uma olhada no conteúdo de um pipe, nem há uma maneira de ler um caractere no pipe e depois colocá-lo de volta. A única maneira de saber que um pipe tem dados é ler um byte e, em seguida, você precisa obter esse byte para o seu destino.
Então faça exatamente isso: leia um byte; se você detectar um fim de arquivo, faça o que deseja fazer quando a entrada estiver vazia; se você ler um byte, em seguida, bifurque o que você deseja fazer quando a entrada não estiver vazia, insira o byte nela e canalize o restante dos dados.
first_byte=$(dd bs=1 count=1 2>/dev/null | od -t o1 -A n)
if [ -z "$first_byte" ]; then
# stuff to do if the input is empty
else
{
printf "\${first_byte# }"
cat
} | {
# stuff to do if the input is not empty
}
fi
O utilitário ifne
de moreutils de Joey Hess executa um comando se sua entrada não estiver vazia. Geralmente não é instalado por padrão, mas deve estar disponível ou ser fácil de construir na maioria das variantes unix. Se a entrada estiver vazia, ifne
não fará nada e retornará o status 0, que não pode ser distinguido do comando executado com êxito. Se você quiser fazer alguma coisa se a entrada estiver vazia, você precisa organizar o comando para não retornar 0, o que pode ser feito fazendo com que o caso de sucesso retorne um status de erro distinto:
ifne sh -c 'do_stuff_with_input && exit 255'
case $? in
0) echo empty;;
255) echo success;;
*) echo failure;;
esac
test -t 0
não tem nada a ver com isso; testa se a entrada padrão é um terminal. Ele não diz nada de uma maneira ou outra sobre se alguma entrada está disponível.