Você faz:
cat "$wd/wakeUp_blacklist.txt" | while read black; do
No Bash :
Each command in a pipeline is executed in its own subshell
Um subshell é outra instância de bash
, com seu próprio estado. Isso significa que quaisquer alterações de variáveis feitas no lado direito de um |
"pertencem" a uma instância diferente de bash
- os valores e declarações existentes no início são copiados, mas as variáveis têm diferentes locais de armazenamento e as modificações são visíveis apenas dentro dessa sub-camada (você pode pensar nisso como se estivesse trabalhando como fork
, se você quiser).
Quando a subshell é concluída, essa cópia da variável deixa de existir. O shell "externo" só vê sua cópia da variável, não modificada, e é por isso que parece que você está perdendo suas modificações fora do loop.
Nesse caso, você pode evitar o uso de um subshell com redirecionamento simples :
while read black; do
...
pass="false"
...
done < "$wd/wakeUp_blacklist.txt"
Agora, o loop while
é executado no seu shell principal e nenhuma subshell é criada. O conteúdo do arquivo da lista negra ainda é fornecido como entrada padrão para o loop usando o < file
redirecionamento . Todas as variáveis existem dentro do mesmo ambiente. Essa abordagem também evita o uso inútil de cat
.
Algumas outras shells (notavelmente zsh
), não têm esse comportamento para começar, e você pode modificar variáveis do lado direito de pipelines livremente.