다소 긴 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 "^_"