bash 함수의 정의 찾기


41

나는 많은 레거시 쉘 스크립트 마술이있는 환경에서 일합니다. 커맨드 라인에서 많이 사용되는 것 중 하나는 내 파일 .bash_profile에 포함 된 파일에서 포함 된 일부 파일에서 가져온 bash 함수입니다. 5 가지 레벨의 포함을 통해 추적하지 않고 이러한 함수의 정의 위치를 ​​정의하거나 더 잘 정의 할 수있는 방법이 있습니까?

답변:



66

foo라는 함수가 있다고 가정하면 아래 명령은 함수 정의의 위치를 ​​가져옵니다. 즉 함수가 정의 된 파일의 이름과 함수가 해당 파일 내에 정의 된 행 번호를 가져옵니다. .

# Turn on extended shell debugging
shopt -s extdebug

# Dump the function's name, line number and fully qualified source file  
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

필자의 경우 이러한 명령의 출력은 다음과 같습니다.

foo 32 /source/private/main/developer/cue.pub.sh

3
완전한. 방금 이것을 bashrc 파일의 bash 함수로 만들었습니다. whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
Neil

5
@Neil : 편리합니다. 감사합니다 : 서브 쉘을 사용 shopt하여 현재 쉘의 상태를 변경하지 않고 효과를 현지화하는 것이 좋습니다 . whichfunc () ( shopt -s extdebug; declare -F "$1"; )( (...)대신에 사용에주의하십시오 {...}).
mklement0

왜 그런 명령이 스크립트에서 작동하지 않습니까? 기능이 제대로 작동
albfan

1
이것이 정답입니다.
해산

11

함수의 정의를 보려면 (원산지가 아니라) 다음을 사용하십시오.

declare -f <functionname>

나는 이것이 type -a성가신 로케일 종속 첫 줄을 인쇄하지 않기 때문에 보다 낫다고 생각합니다 ~~
yuyichao

1
주어진 어떤 위치가 없기 때문에 그러나 이것은 적어도 질문 - 부탁받지 묻지에 대한 답변입니다 여기에
우상 파괴자

6

bash -xbash가 시작될 때 실행중인 것을 덤프하여 더 쉽게 추적 할 수 있습니다. 새로 열린 쉘을 종료하는 것을 잊지 마십시오.


편리한 물건; 파일에서 추적을 캡처하려면 script out.txt bash -x(다시 잊지 말고 exit)를 사용하십시오.
mklement0

-2

다른 방법으로, 요즘 더 간단하게 찾을 수 있습니다.

  which <functionname>

(이것은 또한 별칭인지 스크립트인지를 보여 주지만 별칭의 출처를 추적하지는 않습니다)


2
나는 whichBSD 또는 Mac의 별칭에 대한 정보를 제공 하지 않는다고 생각 합니다. 또한이 질문은 기능에 관한 것이며 기능에 which대한 정보는 제공하지 않습니다.
dbn

그 쪽지 주셔서 감사합니다. "bash"가 아니라 zsh의 함수 만 해결한다는 것을 알았습니다.
Joshua Goldberg

2
이 답변은 다운 투표자를 초대 할 가능성이 있다고 생각합니다 ... 위치에 대한 정보가 없기 때문에 질문을 전혀 다루지 않는 것 같습니다.
iconoclast

선언을 추적하여 이것을 사용하고 별칭 또는 함수인지 확인하고 선언 된 구문을 알아내는 것이 유용하다는 것을 알았습니다. @HairOfTheDog의 답변 만 파일을 직접 제공한다는 것은 사실입니다.
Joshua Goldberg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.