[unix] 일부 명령에서 특정 매개 변수 추적

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

답변