액세스 기능 문서

액세스 기능 문서

Bash에서 독스트링에 접근할 수 있는 방법이 있나요? Bash의 함수 정의에 독스트링을 포함하는 방법은 무엇입니까?

보다 구체적으로 다음 함수에 독스트링을 추가하고 액세스하려면 어떻게 해야 합니까?

    funky() {
    echo "Violent and funky!"
    }

답변1

최적은 아니지만 다음 방법은 긴급 상황에서 잘 작동합니다.

declare -A fundocs_;
doc() { fundocs_[$1]=$2; }
help_doc() { echo "$1:  ${fundocs_[$1]}"; }

doc hi_from_fun "Send a short greeting"
hi_from_fun() { echo "Hi there"; }

help_doc hi_from_fun

문서는 다음과 같이 인쇄됩니다.

hi_from_fun:  Send a short greeting

첫 번째 매개변수는 함수 이름과 일치해야 하므로 이 메서드는 오류가 발생하기 쉽습니다. 장기적으로 오류를 방지하려면 다음과 같이 함수 본문 내에서 함수 문서를 정의할 수 있습니다.

docd() { :; }  # dummy function
# for debug trap based documentation, redefined later
#  should be called with documentation as arguments
#  near the top of function body

fun2() {
    echo "Hi, I'm fun2 without documentation, just doing my job."; }

fun3() {
    docd "says hi3"
    echo "Hi, I'm fun3 with documentation, doing useful work." ; }

fun4() {
    docd "says hi4"
    echo "hi from fun4 doing other useful work"; }

다음과 같이 임시 DEBUG 트랩을 사용하여 독스트링에 접근할 수 있습니다:

docd_() {
    # process args as documentation string
    # and return from nth level caller
    local n=${1:-2}; shift; local c=${FUNCNAME[$n]}
    local f=${1:-'echo $c: $@'}; shift
    [ -n "$c" -a "$c" != source ] && {
        eval $f
        trap "trap - DEBUG; return 2" DEBUG; } }

pdoc() {  #  redefine docd to call docd_ defined above
    docd() {
        docd_ 2 "" $@
        # default action: echo "function_name:  document_string"
    }

    for f; do $f; done  # arguments are function names

    docd() { : # so that the next call to function runs normally
    }
 }

그래서

pdoc fun1 fun4 fun2 docd_ fun3

다음을 인쇄합니다:

bash: fun1: command not found
fun4: says hi4
Hi, I'm fun2 without documentation, just doing my job.
fun3: says hi3

메뉴를 작성하기 위해 문서를 배열로 캡처할 수 있습니다. 예를 들어:

prepdoc() {  # collect documentation of functions
    declare -Ag fundocs_
    docd() { docd_ 2 "fundocs_[\$c]=\"\$*\"" $@; }
    for f; do $f; done
    docd() { :; }
    declare -p fundocs_; }

prepdoc fun1 fun4 fun2 docd_ fun3

다음을 인쇄합니다:

bash: fun1: command not found
Hi, I'm fun2 without documentation, just doing my job.
declare -A fundocs_='([fun3]="says hi3" [fun4]="says hi4" )'

존재하지 않는 fun1 및 문서화되지 않은 fun2는 예외이며 일반적으로 스캔 중에 피해야 하지만 호출 시 어떤 일이 발생하는지 보여주기 위해 위에 포함되었습니다.

마지막으로 각 기능이 올바르게 작동하는지 확인합니다.

for f in fun1 fun4 fun2 docd_ fun3; do $f; done

다음을 인쇄합니다.

bash: fun1: command not found
hi from fun4 doing other useful work
Hi, I'm fun2 without documentation, just doing my job.
Hi, I'm fun3 with documentation, doing useful work.

답변2

"Python의 독스트링에 해당하는 Bash"를 의미한다면 실망하게 될 것 같습니다. 왜냐하면 그런 것이 없기 때문입니다.

그러나..구현은 "docstring" 기능과 동일하다고 말해야 합니다.회의helpBash의 프로그래밍 가능 완성 기능과 "docstring" 표시 또는 help일반적인 내장 명령의 출력 과 같은 내장 명령을 재정의하는 방법을 배우는 매우 흥미로운 숙제입니다 .

관련 정보