git branch예를 들어 (항상 두 단어로) 명령이 있다고 가정 해 봅시다 .
내가 원하는 것은 인수 로이 명령이 실행될 때를 추적하는 것입니다. 예를 들어, git branch develop오류없이 명령 을 실행하면 develop파일 에 저장하고 싶습니다 .
내 git 명령을 .bash_profile다음과 같이 덮어 쓰려고 했습니다.
git () {
if [ $# -eq 3 ]
then
git $@
echo $2 > /path/tacked_parameters.txt
else
git $@
fi
}
그러나 그것은 잘 작동하지 않는 것 같습니다. 이것을 할 수있는 방법이 있습니까?
답변
여기 몇 가지 문제가 있습니다.
- 당신의
git기능을 대신 원래의 자신을 재귀 적으로 호출git명령. - 당신이 사용하는
$@어떤 이해가되지 않는 인용 부호가 무엇이든지 - 당신이있어 인용 부호가없는 다른 변수를 떠나 그들 glob에 분할 + 셸을 묻는.
- 당신이있어 사용하여
echo임의의 데이터를 . - 원래
git명령 의 종료 상태가 유실 됩니다. - 호출 할 때마다 로그 파일을 덮어 씁니다.
- 함수 정의는 사용자
~/.bash_profile의 쉘이 아닌 로그인 세션을 사용자 정의하기위한 것이며 일반적으로 비 로그인bash호출로 읽히지 않습니다 .
당신은 다음과 같은 것을 원할 것입니다 :
git() {
if [ "$#" -eq 3 ]
then
local ret
command git "$@"; ret=$?
printf '%s\n' "$2" >> /path/tacked_parameters.txt
return "$ret"
else
command git "$@"
fi
}
그건:
- 변수를 인용하고
- 사용
command실행하는git명령을 , - 종료 상태를
git로컬 변수에 저장하고 종료시 반환 - 로그 파일로 리디렉션 하는
>>대신 사용>하십시오. printf대신에 사용하십시오echo.- 그리고
~/.bashrc대신에 넣으십시오 ( 로그인 쉘이 기본적으로 읽히지 않기 때문에~/.bash_profile소싱 하고 있는지 확인하십시오 ( 버그 / 잘못된 기능)). 호출 하는 스크립트에서 해당 함수를 호출 하려는 경우를 위해 해당 함수를 (with ) 로 내 보내지 않는 한 .~/.bashrcbash~/.bashrcbashgitexport -f gitbashgit
