다음과 같이 명령의 출력을 리디렉션 대상으로 만들려고 합니다.
echo .envrc >> $(git config --global core.excludesfile)
하지만 이 오류가 발생합니다 . ~/.gitignore_global
의 출력은 어디에 있습니까 git config --global core.excludesfile
?
bash: ~/.gitignore_global: No such file or directory
다음을 사용하여 작동시킬 수 있었습니다 eval
.
eval "echo .envrc >> $(git config --global core.excludesfile)"
이전에는 왜 작동하지 않았나요? 더 좋은 방법이 있나요?
답변1
문제는 전역 git 구성에 ~
명령 대체 결과로 실행될 때 셸에서 해석되지 않는 리터럴(물결표)이 포함되어 있다는 것입니다. 전역 Git 구성에는 다음이 포함될 수 있습니다.
[core]
excludesfile = ~/.gitignore_global
첫 번째 명령은 작은따옴표를 사용하여 셸이 해당 문자를 해석하지 못하도록 하는 다음 구문과 동일합니다 ~
.
echo .envrc >> '~/.gitignore_global'
를 사용하면 eval
예상되는 명령을 생성하는 물결표 확장을 포함하여 문자열 인수(이 경우 위 줄)가 (재)해석되므로 이 문제가 해결됩니다.
echo .envrc >> /home/your_user/.gitignore_global
이 문제를 해결하는 또 다른 방법은 전역 git 구성의 값이 전체 경로인지 확인하는 것입니다.
git config --global core.excludesfile ~/.gitignore_global
이 경우 셸은 ~
로 확장되므로 /home/your_user
전역 git 구성 파일의 내용은 다음과 같습니다.
[core]
excludesfile = /home/your_user/.gitignore_global
답변2
대화형 셸 외부에서는 이러한 틸다를 사용하지 않는 것이 가장 좋습니다. (쉘 스크립트는 일반적으로 $HOME
환경 변수를 사용합니다). 더 나은 접근 방식은 필요한 경우 안전하게 확장하는 것이지만 쉽지 않습니다.https://stackoverflow.com/questions/3963716/how-to-manually-expand-a-special-variable-ex-tilde-in-bash/29310477#29310477
일회성 명령이고 git config --global core.excludesfile
평가 결과가 무엇인지 알고 평가해도 안전하다면 솔루션은 괜찮습니다.