призначити та перевірити метадані функції bash


10

Я часто генерую та реєструю безліч функцій bash, які автоматизують багато завдань, які я зазвичай виконую в своїх розробних проектах. Це покоління залежить від метаданих проекту, над яким я працюю.

Я хочу анотувати функції таким чином, щоб інформація про проект, який вони були створені, таким чином:

func1() {
# This function was generated for project: PROJECT1
echo "do my automation"
}

В ідеалі я міг би побачити коментар, коли перевіряю визначення:

$ type func1

func1 is a function
func1 () 
{
    # This function was generated for project: PROJECT1
    echo "do my automation"
}

Але якось bash, здається, ігнорує коментарі в момент завантаження функції, а не при її виконанні. Так що коментарі втрачені, і я отримую такий результат:

func1 is a function
func1 () 
{
    echo "do my automation"
}

Чи є спосіб призначити метадані функції та перевірити їх після цього? Можна отримати його під час перевірки визначення з типом?


1
Це не рішення (звідси коментар), але обхід, який я використовую, - це перевірити, чи $1є -h, а потім printf/ echoоднолінійна допомога / використання / що завгодно.
Іван N

Відповіді:


13
function func_name()
{
  : '
  Invocation:   func_name $1 $2 ... $n
  Function:     Display the values of the supplied arguments, in double quotes.
  Exit status:  func_name always returns with exit status 0.
  ' :
  local i
  echo "func_name: $# arguments"
  for ((i = 1; i <= $#; ++i)); do
    echo "func_name [$i] \"$1\""
    shift
  done
  return 0
}

2
хммм, доктрини в басі. Хто знав?
Брайан Мінтон

Чи є можливість запитати цей коментар? Я роздумую над функцією довідки з генерації для всіх команд.
Юсер

7

Так, typeздається, роздруковується лише частини функції, яка буде запущена. Мені це здається розумним, адже, як правило, це все, що вам цікаво під час запитів type.

Для вирішення замість коментарів додайте метадані так:

func1() {
    meta="This function was generated for project: PROJECT1"
    echo "do my automation"
}

Ніколи не потрібно реально використовувати цю змінну, але вона з’явиться при запиті функції за допомогою type:

$ type func1
func1 is a function
func1 () 
{ 
    meta="This function was generated for project: PROJECT1";
    echo "do my automation"
}

2
Якщо ви хочете уникнути збереження змінної, ви можете скористатися оператором nop ":" таким чином: функція func () {: "метадані" # do
your

1
Я думаю, що одиничні котирування тут кращі, ніж подвійні лапки, про всяк випадок, якщо в докстрині ховаються небажані розширення
Digital Trauma

6

Ви можете використовувати вбудований nop: . Крім того, вам не потрібно зберігати його як змінну:

function f() {
  : your metadata here
  : "or here"
  # do yours
}

EDIT : Остерігайтеся спеціальних символів у ваших метаданих. Для чистого тексту можна використовувати:

: <<EOT
Your metadata text here.
EOT

EDIT : Ви можете використовувати замість глобального асоціативного масиву для зберігання метаданих усіх функцій:

declare -A METADATA=()
METADATA[fun1]='foo bar'
function fun1() {
  echo I have some metadata: "${METADATA[$FUNCNAME]}"
}
METADATA[fun2]='baz you'
function fun2() {
  echo I have some other metadata: "${METADATA[$FUNCNAME]}"
}

Таким чином, вам не потрібно розбирати declareабо typeвиводити вихід, а лише запитувати ключ масиву.


1
Будьте уважні - вони your metadata hereможуть містити розширення, які мають побічні ефекти. Краще використовувати одинарні лапки, як-от відповідь @ AlexP.
Цифрова травма

Так, але ви також повинні бути обережні всередині цитат.
Luchostein

3

Ви можете це зробити.

$ f() { This function does nothing. 2> /dev/null; }
$ f
$ type f
f is a function
f () 
{ 
    This function does nothing. 2> /dev/null
}

але функція все-таки повинна виконувати свої речі після анотації. У зразку, який я включив, відлуння все ще має працювати, коли я нормально викликаю функцію.
Юсер

@yucer Було б. Це лише ілюстрація. Спробуй це. Однак це має свої обмеження. Ніякі спеціальні символи на зразок (не можуть використовуватися, і перше слово не повинно бути дійсною командою.

Добре. Він вважає, що це правильна відповідь, хоча для запуску потрібен додатковий час. Також може бути краще включити відлуння та метадані, які я використав у своєму прикладі.
Юсер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.