[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