bash: mail addr <( echo '..' )

Horst von Brand vonbrand en inf.utfsm.cl
Lun Abr 19 18:11:44 CLT 2004


=?X-UNKNOWN?Q?Jos=E9_Angel_Rodr=EDguez_Leyva?= <jar en villazul.ltu.sld.cu> dijo:
> On Mon, 19 Apr 2004, Mauricio Vergara Ereche wrote:
> 
> > > mail -s "Asunto..." addr <( sed s/expr1/expr2/ archivo )

> > El redireccionador "<" espera la entrada de un archivo por el descriptor
> > 0... Al agregarle el paréntesis le estas diciendo que esperará que se le
> > entregue una lista.

> No he estudiado como funcionan la entrada y salida estandar a nivel del
> comando en el shell, asi que no puedo entender en que radica la diferencia
> en pasarle un fichero o una lista para el comando que los recibe por la
> entrada estandar. A fin de cuentas no serian la misma cosa? Es evidente 
> que hay diferencias, supongo que debo investigar para poder comprenderlo.

Es bien diferente:

   less lindo-archivito

(muestra el contenido de lindo-archivito, porque less(1) lee de su(s)
argumentos(s) si los hay) que

   ls -la | less

(muestra la salida de ls(1), si no hay argumentos less(1) lee su entrada
standard) o que

   less <<FIN
   Aca va chachara, que less(1) recibira en la entrada standard
   Es una manera de crear "archivos" a ser leidos por un programa
   invocado en un script, pero sin tener que tontear con archivos
   temporales. Lineas aca salen tal cual.
   FIN

(less(1) nuevamente sin argumentos) o que

   less <<<"Algun hermoso string"

(muestra "Algun hermoso string", que es ahora la entrada de less(1),
nuevamente sin argumentos)

[Alguna idea absurda para <<<<?]

[...]

> > mail -s "Asunto..." addr <<< $(sed s/expr1/expr2/ archivo)
> 
> Aun asi me quedo sin entender porque s'i funciona con << o <<< y no con <

Es que

   cmd1 < $( cmd2 )

significa: Ejecute "cmd2", el resultado dejelo como argumentos (uno por
linea) interpolados; si cmd diera el nombre de un archivo, ese recibiria
cmd1 en su stdin. En cambio:

   cmd1 <<< $( cmd2 )

ejecuta cmd2, igual que antes; luego <<< concatena (sin saltos de linea!)
lo que resulte, y pasa eso como entrada a cmd1. Es parecido a

   cmd2 | tr -d '\n' | cmd1

solo que seguramente mas ineficiente, y probablemente estalle si cmd2
genera salida muy voluminosa (tr(1)).
-- 
Dr. Horst H. von Brand                   User #22616 counter.li.org
Departamento de Informatica                     Fono: +56 32 654431
Universidad Tecnica Federico Santa Maria              +56 32 654239
Casilla 110-V, Valparaiso, Chile                Fax:  +56 32 797513



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