비슷한 것에 부딪쳤다; 내 메모를 게시 할 수 있기를 바랍니다. git
별명과 인수 를 혼동하는 한 가지 이유는 아마도 git help config
(git 버전 1.7.9.5가 있음)에서 비롯된 것입니다.
별명 확장 앞에 느낌표가 있으면 쉘 명령으로 취급됩니다. 예를 들어, "alias.new =! gitk --all --not ORIG_HEAD"를 정의하면 "git new"호출은 쉘 명령 "gitk --all --not ORIG_HEAD"를 실행하는 것과 같습니다. 쉘 명령은 저장소의 최상위 디렉토리에서 실행되며 반드시 현재 디렉토리 일 필요는 없습니다. [...]
느낌표가 접두사로 붙일 때 별칭이 "쉘 명령으로 취급되는 경우"인 경우 함수 나 sh -c
인수 를 사용해야하는 이유는 무엇입니까 ? 왜 내 명령을 그대로 작성하지 않습니까?
나는 아직도 답을 모른다. 그러나 나는 실제로 결과에 약간의 차이가 있다고 생각한다. 여기에 약간의 테스트입니다 -이 던져 귀하 .git/config
또는 귀하의 ~/.gitconfig
:
[alias]
# ...
ech = "! echo rem: "
shech = "! sh -c 'echo rem:' "
fech = "! f() { echo rem: ; }; f " # must have ; after echo!
echargs = "! echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ "
fechargs = "! f() { echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ ; }; f "
이 별명을 실행하면 다음과 같습니다.
$ git ech word1 word2
rem: word1 word2
$ git shech word1 word2
rem:
$ git fech word1 word2
rem:
$ git echargs word1 word2
0[[ echo 0[["$0"]] 1-"$1"/ A-$@/ ]] 1-word1/ A-word1 word2/ word1 word2
$ git fechargs word1 word2
0[[ f() { echo 0[["$0"]] 1-"$1"/ A-$@/ ; }; f ]] 1-word1/ A-word1 word2/
... 또는 : 별명 !
에서 "있는 그대로" 뒤에 "plain"명령을 사용하는 경우 인수 목록을 해당 명령에 자동으로 추가합니다! 이를 피하는 방법은 실제로 스크립트를 함수 또는에 대한 인수로 호출하는 것 입니다.git
git
sh -c
여기서 또 다른 흥미로운 점은 쉘 스크립트에서 자동 변수 $0
가 스크립트의 파일 이름이 될 것으로 예상 한다는 것입니다. 그러나 git
별칭 함수의 경우 $0
기본적으로 인수는 구성 파일에 입력 된대로 해당 명령을 지정하는 전체 문자열 의 내용입니다 .
그렇기 때문에 아래 인용문에서 잘못 인용하면 외부 큰 따옴표를 피할 수 있습니다.
[alias]
# ...
fail = ! \"echo 'A' 'B'\"
...-그렇다면 git
다소 비밀스러운 메시지로 실패합니다 (적어도 나를 위해).
$ git fail
"echo 'A' 'B'": 1: echo 'A' 'B': not found
fatal: While expanding alias 'fail': ' "echo 'A' 'B'"': No such file or directory
git
전체 문자열을 하나의 인수로 "본" 때문에 !
실행 파일로 실행하려고했습니다. 그에 "echo 'A' 'B'"
따라 파일로 찾지 못했습니다 .
어쨌든 git help config
위 의 인용문 과 관련하여 다음과 같이 진술하는 것이 더 정확하다고 추측합니다. " ... 호출"git new "는 쉘 명령"gitk --all --not ORIG_HEAD를 실행하는 것과 같습니다. $ @ ", 여기서 $ @는 런타임시 명령 행에서 git 명령 별명으로 전달되는 인수입니다. ... ". OP의 "직접"접근법이 위치 매개 변수와 함께 작동하지 않는 이유도 설명 할 것이라고 생각합니다.
$1
이 작동해야 함).