Para as outras respostas, elas parecem abordagens interessantes com bons exemplos, mas eu estava realmente curioso para saber por que essa abordagem que eu vinha usando ad-hoc e em alguns scripts de shell 'parou' de funcionar ou não funcionou no meu sistema Windows.
Eu não vi que eles postaram respostas diretamente relacionadas a como eu posso conseguir isso usando read
e pipes, então aqui está minha atualização como uma forma de fechamento onde eu testo alguns exemplos e realço a funcionalidade específica que tem foi aludido.
Bem, para os comentários sobre a questão, eu posso mostrar isso funciona no meu sistema Mac (10.12.5), no iTerm 3.0.15, no fish
shell:
⋊> ~ echo "hi" | read var;echo $var;
hi
⋊> ~ fish -v
fish, version 2.6.0
Quando eles fazem referência a um subshell sendo usado, ele parece funcionar em fish
, o que eu entendo tem um padrão de arquitetura e design diferente, embora em algumas partes eu esperaria camadas de funcionamento semelhante, pelo menos do ponto de vista do caso de uso .
Então tentei a abordagem novamente no meu Mac, em ambos os intérpretes.
Em fish
:
⋊> ~ echo -ne '1\n2\n3\n' | while read line; echo "a$line""a"; end
a1a
a2a
a3a
Em bash
:
bash-3.2$ echo -ne '1\n2\n3\n' | while read line; do echo "a$line""a"; done
a1a
a2a
a3a
bash-3.2$ echo $BASH
/bin/bash
bash-3.2$ echo $BASH_VERSION
3.2.57(1)-release
Toda a funcionalidade parece estar (principalmente) funcionando como esperado aqui.
Fiquei um pouco surpreso ao descobrir que a variável não está gerando em bash
, mas meu problema original que pensei veio de não obter dados esperados para persistir nesse loop.
Vou ter que verificar meu código mais de perto com tudo isso em mente novamente.
Resultado final
O ponto principal que está sendo destacado aqui não é armazenar a entrada padrão em variáveis simples, canalizando em bash
e continuando normalmente em um script, já que ele é executado em uma subcamada, de acordo com Sharuzzaman Ahmat Raslan e dave_thompson_085 .
Em vez disso, funciona dessa maneira em fish
, ou posso ter mais cuidado trabalhando diretamente na cadeia de tubos com o loop while e voltar para verificar meu código para esses problemas.
Outras Notas
Acho que outro problema em uma das linhas de código é que eu estava tentando usar read -r <varname>
, mas acabei digitando read -p <varname>
.
O último consome um argumento extra para formar um prompt para o comando de leitura, e no meu exemplo com apenas 1 argumento, não deixa nenhum nome de variável útil para armazenar informações e recuperar a partir dele. O primeiro às vezes é útil nos exemplos de outros quando não quer usar seqüências de escape de retrocesso, sempre que for. Portanto, evite erros como este!