특정 스크립트의 모든 함수와 별칭을 나열하는 방법은 무엇입니까?

특정 스크립트의 모든 함수와 별칭을 나열하는 방법은 무엇입니까?

다소 긴 Bash 스크립트가 있습니다. 그 안에 있는 모든 기능을 나열할 수 있다면 좋을 것 같습니다. 더 좋은 방법은 함수 이름과 매개변수 등 사용법에 대한 문서를 나열하는 것입니다.

답변1

일반적인 방법은 declare -f이를 사용하여 대화형 bash 쉘에서 긴 함수 목록을 인쇄하는 것입니다. 그러나 스크립트 내부에서는 대부분의 외부 함수가 정의되어 있지 않으므로 목록이 짧고 유용합니다.

그래서:

declare -f

기능(및 정의)이 나열됩니다. 그리고:

declare -F

이름 기능 목록만 인쇄됩니다.

extdebug설정하면 각 함수 정의의 줄 번호도 인쇄하는 (덜 유용한) 옵션이 있습니다 declare -F. 하지만 extdebug스크립트가 로드될 때 설정해야 합니다(나열하려면 모든 줄을 알아야 하기 때문입니다).

답변2

일반적으로 함수는 와 같은 것을 통해 액세스할 수 있으므로 스크립트를 실행하지 않고 모든 함수를 나열하는 것은 불가능합니다 eval $(/some/program). 그러나 함수가 "정상적으로" 선언된 경우 함수 정의처럼 보이는 것을 검색할 수 있습니다.

grep -E '^[[:space:]]*([[:alnum:]_]+[[:space:]]*\(\)|function[[:space:]]+[[:alnum:]_]+)' myscript

쉘 스크립트에는 함수 유형이나 문서 기능이 없으므로 모든 문서는 주석에서 나와야 합니다. 다음은 일반적으로 사용되는 함수 정의와 바로 앞 또는 뒤의 주석을 추출하는 대략적인 Perl 코드 조각입니다.

perl -0777 -ne '
    while (/^((?:[ \t]*\#.*\n)*)               # preceding comments
             [ \t]*(?:(\w+)[ \t]*\(\)|         # foo ()
                      function[ \t]+(\w+).*)   # function foo
             ((?:\n[ \t]+\#.*)*)               # following comments
           /mgx) {
        $name = "$2$3";
        $comments = "$1$4";
        $comments =~ s/^[ \t]*#+/#/mg;
        chomp($comments);
        print "$name\n$comments\n";
    }' myscript

부작용 없이 스크립트를 실행할 수 있거나 모든 함수 정의를 첨자로 분리할 수 있는 경우, 함수 이름을 인쇄하는 더 정확한 방법은 스크립트를 실행한 다음 bash에서 모든 함수 정의를 인쇄하도록 하는 것입니다. 이상한 형식의 함수 정의를 포함하고 거짓 긍정(예: 여기 문서)을 제외하는 위의 텍스트 검색 방법과 달리 이 방법은 주석을 찾지 못합니다.

bash -c '. myscript; typeset -f'

답변3

declare -F | awk '{print $NF}' | sort | egrep -v "^_" 

관련 정보