[Programación]Detectar stdin vacio!

Mario Oroz jmoroz en uol.com.ar
Vie Ago 20 09:54:16 ART 2010


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

El 19/08/2010 02:42 p.m., Fabian Ezequiel Gallina escribió:
> 2010/8/19 Mario Oroz <jmoroz en uol.com.ar>:
>> Hola gente;
>>
>> Necesito detectar en una  linea de comando compuesta por pipe si un
>> entrada estandar es vaciá.
>>
>> x.txt esta vació; tiene 0 caracteres.
>>
>> # cat x.txt | flip -mb - | lp -s -d printer
>> lp: stdin is empty, so no job has been sent.
>>
>> Lo que pretendo es que no aparezca ese mensaje.
>>
>> entonces quería detectar cuando la orden lp estaba recibiendo
>> un stdin vació
>>
>>
>> Habia pensado en esto:
>>
>> [vacio.sh]
>> ------------
>> #!/bin/bash
>> # Redirecting stdin using 'exec'.
>> exec 6<&0          # Link file descriptor #6 with stdin.
>>                   # Saves stdin.
>> if [ -s /dev/fd/6 ]; then
>>    cat /dev/fd/6
>> else
>>    echo "No hay datos para imprimir."
>> fi
>> exec 0<&6 6<&-
>> ------------
>>
>>
>> # cat x.txt | flip -mb - | ./vacio.sh | lp -s -d printer
>> #
>>
>> Pero no funciona como esperaba! ya que x.txt con y sin texto la salida por
>> impresora es "No hay datos para imprimir."
>>
>>
>> Alguien me da una pista?
>> Desde ya gracias.
>>
> 
> Tocando sólo de oído en bash, y si probás comparar con -z que sería
> comparar si el string es nulo?
> 
> Algo así:
> 
> ...
> if [ -z $(cat /dev/fd/6) ]; then
>    echo "No hay datos para imprimir."
> else
>    cat /dev/fd/6
> fi
> ...
> 
> 
> Saludos,


Bueno, quedo así, pero no me gusta porque debo crear un archivo y no queda bien.
Me gustaria que se resuelva todo en una sola linea o manipulando os descriptores;
Cosa que no pude lograr ya que /dev/fd/6 ni existia, o no tenia permisos para
manipularlo... no se.

[vacio.sh]
========================
#!/bin/bash
cat <&0 > /tmp/x.tmp   # aca tuve que usar un archivo ,
                       # no podia duplicar el descripto de entrada!
                       # tal vez x problema de permisos
if [ $(wc -c < /tmp/x.tmp) != 0 ]; then
    cat /tmp/x.tmp
else
    echo "No hay datos para imprimir."
fi
=========================


La cuestión, repito, es detectar si la entrada estandar (stdin) llegaba desde un
pipe "vacío" o "con texto o datos" para pasar siempre al comando lp un dato que
imprimir. Ya que los listados que genera un sistema de gestión puede o no
generar datos de salida.
Para eso arme este filtro (tambien para evitar *efecto casaca* con flip)


prog_gestion | flip -mb - | vacio.sh | lp -s -d printer
o
cat archivo  | flip -mb - | vacio.sh | lp -s -d printer


si
# : > archivo
# cat archivo  | flip -mb - | vacio.sh | lp -s -d printer
# (imprime) No hay datos para imprimir.
# echo "algo" > archivo
# cat archivo  | flip -mb - | vacio.sh | lp -s -d printer
# (imprime) algo

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkxuevgACgkQYT+KMx1V+Vx37gCgsEAFez9DzdFgBCyHe8Vg2x4i
8QgAoKaUMytJKwVk2CKVCzG3U2R91n2L
=GCgQ
-----END PGP SIGNATURE-----


Más información sobre la lista de distribución Programacion