Доступ к документации по функциям

Ejecutar una instancia de tr -dc '[:alnum:]' </dev/urandom | head -c 6por línea de entrada sería contraproducente -, sería mejor que hiciera:

<input awk -v rng="LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6" '
  {rng | getline r; print "name"r"-"$0}'

Si su entrada no contiene acentos graves ni comillas simples, también puede usar m4'smkstemp():

<input sed "s/.*/mkstemp(name)\`&'/" | m4
0
07.04.2019, 19:55
2 ответа

Если вы имеете в виду «Bash-эквивалент строк документации Python», боюсь, я должен разочаровать вас, что такой вещи не существует.

Однако.. Я должен сказать, что реализация эквивалента функции "docstrings" была бы очень интересной домашней работой для изучения программируемого -средства завершения Bash, а также того, как переопределить встроенный команда, такая как help, чтобы отобразить либо такие «строки документации», либо обычный встроенный вывод help.

1
28.01.2020, 03:51

Несмотря на то, что ниже -оптимально, следующий метод прекрасно работает в крайнем случае:

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
08.05.2021, 15:57

Теги

Похожие вопросы