Substituição de comando como destino para redirecionamento de E / S

3

Eu estava tentando ter a saída de um comando como um alvo de redirecionamento assim:

echo .envrc >> $(git config --global core.excludesfile)

Mas, em vez disso, recebo esse erro, em que ~/.gitignore_global é a saída de git config --global core.excludesfile .

bash: ~/.gitignore_global: No such file or directory

Consegui que funcionasse usando eval :

eval "echo .envrc >> $(git config --global core.excludesfile)"

Por que não funcionou anteriormente e existe uma maneira melhor?

    
por htanata 14.09.2015 / 23:08

2 respostas

2

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
    
por 14.09.2015 / 23:32
1

É melhor não usar tildas assim fora de um shell interativo. (Scripts shell geralmente usam a variável de ambiente $HOME ). Se você precisar, a melhor maneira é fazer a expansão com segurança e isso não é fácil: link

Se é apenas um comando de uso único e você sabe com que git config --global core.excludesfile é avaliado e que é seguro avaliar isso, então sua solução está correta.

    
por 14.09.2015 / 23:27