A notação correta para Substituição de Processo é:
while read i; do echo $i; done < <(echo "$FILECONTENT")
O último valor de i
atribuído no loop fica então disponível quando o loop termina. Uma alternativa é:
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
As chaves são uma operação de agrupamento de E / S e não criam um subshell. Nesse contexto, eles fazem parte de um pipeline e, portanto, são executados como um subshell, mas é por causa do |
, não do { ... }
. Você menciona isso na pergunta. AFAIK, você pode fazer um retorno de dentro deles dentro de uma função.
O Bash também fornece o shopt
integrado e uma de suas muitas opções é:
lastpipe
Se definido, e o controle de trabalho não está ativo, o shell executa o último comando de um pipeline não executado em segundo plano no ambiente shell atual.
Assim, usar algo assim em um script torna o modificado sum
disponível após o loop:
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
Fazer isso na linha de comando geralmente resulta na falta de 'controle de trabalho não está ativo' (ou seja, na linha de comando, o controle de trabalho está ativo). O teste sem usar um script falhou.
Além disso, conforme observado por Gareth Rees em sua resposta , às vezes você pode usar uma string here :
while read i; do echo $i; done <<< "$FILECONTENT"
Isso não requer shopt
; você pode salvar um processo usando-o.