Eu tenho poucas funções definidas dessa maneira:
function f {
read and process $1
...
echo $result
}
Quero compor eles juntos para que a invocação pareça f | g | h
.
Qual idioma devo usar para converter a função que trabalha nos argumentos em argumentos de leitura de stdin? É possível ler pares, tuplas de argumentos do fluxo sem precisar escapar deles (por exemplo, terminação nula)?
bash
shell-script
pipe
Rumca
fonte
fonte
h(g(f(...)))
ou cada uma das funções lê da entrada padrão (read x; ...
) e grava na saída padrão (echo ...
).Respostas:
Uma abordagem potencial seria colocar
while...read
dentro de suas funções uma construção que processasse todos os dados que entrassem na função através do STDIN, operassem nela e depois emitissem os dados resultantes de volta via STDOUT.É preciso ter cuidado com a forma como você configura seus
while ..read..
componentes, pois eles dependem muito dos tipos de dados que poderão consumir com segurança. Pode haver uma configuração ideal que você possa criar.Exemplo
Aqui está cada função por si só.
Aqui estão eles quando os usamos juntos.
Eles podem receber vários estilos de entrada.
fonte
Como um adendo à resposta do slm , fiz algumas experiências com tuplas separadas por nulo como argumentos de função:
Notas:
sayTuple
lê duas vezes um registro terminado por nulo,-d $'\0'
manipulando qualquer espaço ao redor da entradaIFS=
.echo
registros anteriores rodeados por-
O resultado mostra que ele lida corretamente com entradas terminadas em nulo contendo
\n
e\t
:Por favor, adicione sugestões para melhorias nos comentários, é um tópico interessante.
fonte
sayTuple() { arr=() ; while IFS= read -r -d $'\0' arg; do arr+="$arg"; done; echo "sayTuple: ${arr[@]}"; }
.IFS= read -r -d $'\0' -a arg
mas não consegui fazer isso funcionar. Isso permitiria a remoção dowhile
, o que parece desnecessário, mas era o único padrão que eu poderia trabalhar.