A regra correta deve ser:
- Armazena dados em variáveis, armazena o código em funções.
Assim, a maneira correta de ter esse comando funcionando é: faça uma função:
first_command (){ echo "test" >> test.txt; }
Chame a função:
first_command
É isso.
É errado armazenar um comando como uma string.
É ainda pior usar o eval para executar tais comandos.
Parece funcionar para o comando simples, mas o problema oculto é que a etapa eval remove a citação do comando.
Se você armazenar este comando
CMD='echo "test" >> test.txt'
O eval "$CMD"
(sim, até mesmo citado) executará este comando:
echo test >> test.txt
Sem citações !!!.
É muito fácil esquecer que as cotações precisam de gerenciamento especial com eval. E fazer as citações funcionando corretamente sempre é complicado.
Tentar executar um comando armazenado em uma variável que não tenha redirecionamentos (o principal problema que exige o uso de eval) sem o passo eval ainda é complicado e não funciona em todos os casos.
Por favor, leia uma excelente introdução para o problema aqui: Estou tentando colocar um comando em uma variável, mas o casos complexos sempre falham!