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 
