Este comando funciona conforme o esperado:
$(echo 10 > file.txt)cat file.txt; $(echo 5 > file.txt)cat file.txt
Saída:
10
5
Este, no entanto, não:
bash -c "$(echo 10 > file.txt)cat file.txt; $(echo 5 > file.txt)cat file.txt"
Saída:
5
5
Ainda mais estranho é esse comportamento:
bash -c "$(echo 10 > file.txt)cat file.txt; rm -f file.txt; $(echo 5 > file.txt)cat file.txt"
Saída:
5
cat: file.txt: No such file or directory
Mesmo adicionando sono:
bash -c "$(echo 10 > file.txt)cat file.txt; sleep 1; rm -f file.txt; sleep 1; $(echo 5 > file.txt)cat file.txt"
você obtém um comportamento de ficção científica, a mesma saída de antes:
5
# 2 seconds wait...
cat: file.txt: No such file or directory
Quase parece que a ordem dos comandos é da direita para a esquerda.
Como tal estranheza é concebível?
EDITAR:
@steeldriver com x
Entrada:
bash -c "$(echo 10 > file.txt)cat file.txt; $(echo 5 > file.txt)cat file.txt"
Saída:
++ echo 10
++ echo 5
+ bash -c 'cat file.txt; cat file.txt'
5
5
Primeiro, os comandos dentro dos colchetes são executados e, em seguida, os de fora, ou seja, duas sobrescritas no arquivo são realizadas e, em seguida, duas operações cat consecutivas sem sentido. Com essa consciência, descobri a maneira de obter os resultados desejados usando um acréscimo em vez de uma sobrescrita.
SOLUÇÃO CORRETA:
Saída: