Tengo pocas funciones definidas de esta manera:
function f {
read and process $1
...
echo $result
}
Quiero componerlos juntos para que se vea la invocación f | g | h
.
¿Qué idioma debo usar para convertir la función que trabaja en argumentos en argumentos de lectura de stdin? ¿Es posible leer pares, tuplas de argumentos de la secuencia sin necesidad de escapar de ellos (por ejemplo, terminación nula)?
bash
shell-script
pipe
Rumca
fuente
fuente
h(g(f(...)))
o cada una de las funciones lee de la entrada estándar (read x; ...
) y escribe en la salida estándar (echo ...
).Respuestas:
Un enfoque potencial sería colocar una
while...read
construcción dentro de sus funciones que procesara cualquier información que ingresara a la función a través de STDIN, la operara y luego emitiera los datos resultantes a través de STDOUT.Se deberá tener cuidado con la forma en que configura sus
while ..read..
componentes, ya que dependerán en gran medida de los tipos de datos que podrán consumir de manera confiable. Puede haber una configuración óptima que se te ocurra.Ejemplo
Aquí está cada función por sí misma.
Aquí están cuando los usamos juntos.
Pueden tomar varios estilos de entrada.
fuente
Como una adición a la respuesta de slm , hice algunos experimentos con tuplas separadas por nulos como argumentos de función:
Notas:
sayTuple
lee dos veces un registro terminado en nulo que-d $'\0'
maneja cualquier espacio que rodea la entradaIFS=
.echo
registros anteriores rodeados de-
El resultado muestra que maneja correctamente la entrada terminada en nulo que contiene
\n
y\t
:Agregue sugerencias para mejorar en los comentarios, es un tema interesante.
fuente
sayTuple() { arr=() ; while IFS= read -r -d $'\0' arg; do arr+="$arg"; done; echo "sayTuple: ${arr[@]}"; }
.IFS= read -r -d $'\0' -a arg
pero no pude hacer que esto funcione. Esto permitiría eliminar elwhile
, lo que parece innecesario, pero fue el único patrón que pude poner a trabajar.