O problema é que a configuração global do git contém um literal ~
(til) que não é interpretado pelo shell quando é emitido como resultado de uma substituição de comando. Sua configuração global do git provavelmente contém o seguinte:
[core]
excludesfile = ~/.gitignore_global
Seu primeiro comando é o equivalente da seguinte construção, que usa aspas simples para impedir a interpretação da shell do caractere ~
:
echo .envrc >> '~/.gitignore_global'
Usar eval
corrige isso porque causa (re) intepretação de seu argumento de cadeia (neste caso, a linha exata acima), incluindo a expansão de til, que resulta no comando esperado:
echo .envrc >> /home/your_user/.gitignore_global
Outra maneira de corrigir isso é garantir que o valor em sua configuração global do git seja um caminho completo:
git config --global core.excludesfile ~/.gitignore_global
Nesse caso, o shell expandirá ~
para /home/your_user
, portanto, o conteúdo do arquivo de configuração global do git lerá algo como:
[core]
excludesfile = /home/your_user/.gitignore_global