bash 함수를 정의하는 파일을 찾는 방법은 무엇입니까?

bash 함수를 정의하는 파일을 찾는 방법은 무엇입니까?

bash 함수가 정의된 파일을 찾는 방법을 모르겠습니다( __git_ps1제 경우에는).

declare, type을 시도했지만 which소스 파일을 알려주지 않았습니다. declare파일 이름과 줄 번호를 인쇄할 수 있다는 내용을 어딘가에서 읽었 지만 방법은 설명되지 않았습니다. help페이지 declare에도 아무 말도 없습니다.

이 정보를 어떻게 얻을 수 있나요?

답변1

함수를 실행할 준비가 되었다면 set -x트레이스 실행 및 PS4변수 설정을 통해 정보를 얻을 수 있습니다.

  1. bash를 시작하거나 --debugger이를 사용하여 shopt -s extdebug추가 디버깅 정보를 기록하십시오.

  2. Set PS4, 소스 행을 표시하기 위해 추적할 때 "힌트"가 인쇄됩니다.

  3. 추적을 켜세요.

  4. 그런 다음 함수를 실행할 수 있으며 각 줄에 대해 함수의 파일 이름을 얻을 수 있습니다.

  5. set +x추적을 끄는 데 사용됩니다 .

따라서 이 경우에는 다음을 실행합니다.

bash --debugger
PS4='+ ${BASH_SOURCE[0]} '
set -x ; __git_ps1 ; set +x

답변2

함수를 실행하지 않으려는 경우에도 디버깅을 설정하고 정보를 얻을 수 있습니다. 단계는 다음과 같습니다

  1. 함수를 정의하기 전 bash --debugger이나 시작 부분에 있습니다 .shopt -s extdebug
  2. declare -F __git_ps1

함수가 정의된 위치를 보고합니다.

주석이 달린 실행 추적을 보기 위해 PS4를 사용하는 것과 비교하여 이 접근 방식의 장점은 다음과 같습니다.

  • 출력이 훨씬 적습니다.
  • 질문에 직접 답변했습니다

실행 추적의 장점은 다음과 같습니다.

  • 호출된 모든 함수를 즉시 확인
  • 호출 함수 간의 관계 보기
  • 재귀 참조

강하게shopt -s extdebug두 가지로 시작하여 서로 다른 콘텐츠를 다루는 것이 좋습니다 ~/.bashrc.~/.bash_profile문서다른 용도로 사용됨기도하다사례.

답변3

에서는 불가능해 보이지만 bash다음에서는 가능합니다 zsh.

$ type __git_ps1
> __git_ps1 is a shell function from /usr/share/git/git-prompt.sh

답변4

같은 이름의 함수를 선언하고 가능한 한 빨리 읽기 전용으로 만든 후 다음과 같이 xtrace 모드를 활성화합니다.

__git_ps1(){ :;}
readonly -f __git_ps1
set -x

나중에 로그인하면 파일 출처를 포함한 추적 정보가 표시됩니다. 기존 읽기 전용 함수를 선언하려고 하면 오류 메시지가 표시됩니다. 위의 마지막 소스 파일에는 찾고 있는 선언이 포함되어 있어야 합니다.

이를 시스템 bash 구성 파일에 넣어야 할 수도 있습니다. 또한 범인을 찾으면 변경 사항을 되돌리는 것을 잊지 마십시오.

관련 정보