Você pode definir um:
has_output() {
LC_ALL=C awk '1;END{exit!NR}'
}
E então:
if cmd | has_output; then
echo cmd did produce some output
fi
Algumas implementações de awk
podem sufocar em caracteres NUL na entrada.
Ao contrário de grep '^'
, seria garantido que o acima funcione em uma entrada que não termine em um caractere de nova linha, mas que adicione a nova linha ausente.
Para evitar isso e ser portátil para sistemas em que awk
bloqueia o NUL, você pode usar perl
:
has_output() {
perl -pe '}{exit!$.'
}
Com perl
, você também pode definir uma variante que manipule arquivos arbitrários com mais graça:
has_output() {
PERLIO=:unix perl -pe 'BEGIN{$/=536} END{exit!$.}'
}
Isso limita o uso de memória (como para arquivos que não possuem caracteres de nova linha como arquivos grandes e esparsos).
Você também pode criar variantes como:
has_at_least_one_non_empty_line() {
LC_ALL=C awk '$0 != "" {n++};1; END{exit!n}'
}
ou:
has_at_least_one_non_blank_line() {
awk 'NF {n++};1; END{exit!n}'
}
(cuidado com a definição de blank varia entre awk
implementations, alguns onde é limitado a espaço e tab, alguns onde também inclui caracteres de espaçamento vertical ASCII como CR ou FF, alguns onde considera os espaços em branco do locale)
O ideal é que, no Linux, você queira usar a chamada do sistema splice()
para maximizar o desempenho. Não sei de um comando que exponha isso, mas você sempre pode usar python
' ctypes
:
has_output() {
python -c 'if 1:
from ctypes import *
import sys
l = CDLL("libc.so.6")
ret = 1
while l.splice(0,0,1,0,65536,0) > 0:
ret = 0
sys.exit(ret)'
}
(observe que stdin ou stdout de has_output
(ou ambos) tem que ser um canal para que splice()
funcione).