[eside-ghost] Bash - Filtrando salida de proceso mientras se guarda en variable

Bruno Gonzalez stenyak en gmail.com
Mie Ago 1 13:59:30 CEST 2012


Ah, otro inciso: si la salida de mi_comando es, por ejemplo,
"foo\nbar\nbaz", el bucle no va a procesar "baz" porque está tras el
último salto de línea. Suelo arreglarlo hardcodeándole un salto de
línea, por ej:
(mi_comando; echo) | filter

Nunca he investigado como arreglarlo correctamente...

2012/8/1 Jon Valdés <juanval en gmail.com>:
> 2012/8/1 Bruno Gonzalez <stenyak en gmail.com>:
>> Qué diablos, mételo a una función y listo:
>>
>> function filter
>> {
>>     local output=""
>>     while read line
>>     do
>>         echo "$line"
>>         output="$output\n$line"
>>     done
>>     #after EOS
>>     printf $output #or whatever
>> }
>> mi_comando | filter
>
>
> Wow! Funciona perfect, muchas gracias! :)
>
> Da gusto tener esta panda de gurús de bash a mano :-P
>
>
>> 2012/8/1 Bruno Gonzalez <stenyak en gmail.com>:
>>> Si, al pipear while, bash lo pone automaticamente en una subshell, y
>>> "pierde" los valores locales al salir.
>>>
>>> Mira a ver si jugando con exec puedes apañártelas para no necesitar un
>>> pipe en el while.
>>> Pero lo más sencillo igual es pasarlo a ksh, que se comporta de forma
>>> más sana, sin subshells ni historias.
>>> O bien tirar del archivo intermediario (si no puedes depender de que
>>> ksh esté instalado en los equipos).
>>>
>>> 2012/8/1 Jon Valdés <juanval en gmail.com>:
>>>> 2012/8/1 Pablo Garaizar Sagarminaga <garaizar en deusto.es>:
>>>>> Aupa,
>>>>>
>>>>> El Wed, 1 Aug 2012 12:04:09 +0200
>>>>> Bruno Gonzalez <stenyak en gmail.com> comentaba:
>>>>>
>>>>>> Uhmm... por si no es muy obvio, se me ha olvidao decir que ese script
>>>>>> toma como input a stdout. Es decir lo guardas como "filter.sh", y
>>>>>> luego lo usas tal que:
>>>>>> $ comando.sh | ./filter.sh > /tmp/passthrough_del_stdout.txt
>>>>>
>>>>> Si Jon lo quiere dentro de su script, siempre puede cambiar el
>>>>>
>>>>> while read line
>>>>>
>>>>> por:
>>>>>
>>>>> comando | while read line
>>>>>
>>>>> y dejar el resto igual. Creo que debería funcionar :-)
>>>>
>>>> Lo he estado intentando, y no lo consigo.
>>>> Sospecho que el "while" crea un entorno distinto que no comparte las
>>>> variables con el script original, porque esto no tira:
>>>>
>>>> output=""
>>>> find . | while read line
>>>> do
>>>>     printf "$line\n"
>>>>     output="$output\n$line"
>>>> done
>>>>
>>>> echo "********************"
>>>> printf "$output\n"
>>>>
>>>> He probado a ponerle un export al output dentro del while, y tampoco.
>>>> _______________________________________________
>>>> eside-ghost mailing list
>>>> eside-ghost en listas.deusto.es
>>>> https://listas.deusto.es/mailman/listinfo/eside-ghost
>>>
>>>
>>>
>>> --
>>> Saludos,
>>>      Bruno González
>>>
>>> _______________________________________________
>>> Jabber: stenyak AT gmail.com
>>> http://www.stenyak.com
>>
>>
>>
>> --
>> Saludos,
>>      Bruno González
>>
>> _______________________________________________
>> Jabber: stenyak AT gmail.com
>> http://www.stenyak.com
>> _______________________________________________
>> eside-ghost mailing list
>> eside-ghost en listas.deusto.es
>> https://listas.deusto.es/mailman/listinfo/eside-ghost
> _______________________________________________
> eside-ghost mailing list
> eside-ghost en listas.deusto.es
> https://listas.deusto.es/mailman/listinfo/eside-ghost



-- 
Saludos,
     Bruno González

_______________________________________________
Jabber: stenyak AT gmail.com
http://www.stenyak.com


Más información sobre la lista de distribución eside-ghost