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


10

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 branch develop)에 따르면 "$ #"이 "3"이 아닌 "2"인지 확인하고 싶습니까? ... (git 함수에 대한 2 개의 파라미터)
Olivier Dulac

실수 였지만 코드는 예제
일뿐입니다.

확인. 나는 Stephane의 (좋은) 답변 아래에 발언을 추가했습니다. 내 말이 해당되지 않을 수 있습니다 (.txt를 로그 파일로 생각하지만 날짜가없는 다른 파일 일 수 있습니까?)
Olivier Dulac

답변:


18

여기 몇 가지 문제가 있습니다.

  • 당신의 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

1
놀라운 설명과 매력처럼 작동합니다. 대단히 감사합니다.
jherran

좋은 답변을 얻으려면 +1하십시오. 그러나 op는 [ "$#" -eq 2 ]그의 예에 따라 수표를로 변경해야 할 수도 있습니다 . 또한 "tacked_parameters.txt"에 날짜를 추가하는 것이 좋습니다. 나는 경우 제거 것, 그리고이 : 그리고 (2 개 매개 변수가 있지만, 매개 변수를 추적 할 때 즉, 단지 2 매개 변수의 추적하지) 일반적인 경우 가고 싶어 : printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*"? (즉, 명령 + 모든 매개 변수를 표시하십시오 (예 : 매개 변수에 내부 분리기가있는 경우와 같이 여전히 일부 정보가 유실 됨에 유의하십시오. iso8601 표준에 가까운 휴대용 날짜 )
Olivier Dulac
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.