[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