I/O 리디렉션 대상으로서의 명령 대체

I/O 리디렉션 대상으로서의 명령 대체

다음과 같이 명령의 출력을 리디렉션 대상으로 만들려고 합니다.

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평가 결과가 무엇인지 알고 평가해도 안전하다면 솔루션은 괜찮습니다.

관련 정보