przypisuj i sprawdzaj metadane funkcji bash

10

Często generuję i rejestruję wiele funkcji bash, które automatyzują wiele zadań, które zwykle wykonuję w swoich projektach programistycznych. To generowanie zależy od metadanych projektu, nad którym pracuję.

Chcę opisać funkcje informacjami o projekcie, który zostały wygenerowane, w ten sposób:

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

Idealnie byłoby zobaczyć komentarz, gdy sprawdzę definicję:

$ type func1

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

Ale bash wydaje się ignorować komentarze w momencie ładowania funkcji, a nie podczas jej wykonywania. Komentarze są zgubione i otrzymuję ten wynik:

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

Czy jest jakiś sposób przypisania metadanych do funkcji i sprawdzenia ich później? Czy można je odzyskać podczas sprawdzania definicji typu?

Yumper
źródło
1
Nie jest to rozwiązanie (stąd komentarz), ale obejście, którego używam, to sprawdzenie, czy $1jest -h, a następnie printf/ pomoc echow jednym wierszu / użycie / cokolwiek.
John N
2
Zobacz także: unix.stackexchange.com/questions/295022/...
Jeff Schaller

Odpowiedzi:

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
}
AlexP
źródło
2
hmmm, dokumenty w bash. Kto wiedział?
Brian Minton,
Czy jest jakiś sposób na zapytanie tego komentarza? Zastanawiam się nad funkcją pomocy genery dla wszystkich poleceń.
yumper
7

Tak, typewydaje się , że drukuje tylko te części funkcji, które zostaną uruchomione. Wydaje mi się to rozsądne, ponieważ zazwyczaj to wszystko, czym jesteś zainteresowany, kiedy pytasz type.

Aby obejść ten problem, zamiast używać komentarzy, dodaj swoje metadane w następujący sposób:

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

Nie ma potrzeby używania tej zmiennej, ale pojawi się ona podczas zapytania funkcji za pomocą type:

$ type func1
func1 is a function
func1 () 
{ 
    meta="This function was generated for project: PROJECT1";
    echo "do my automation"
}
terdon
źródło
2
Jeśli chcesz uniknąć przechowywania zmiennej, możesz użyć operatora nop „:” w ten sposób: function func () {: „metadata” # do yours}
Luchostein
1
Myślę, że pojedyncze cytaty są lepsze niż podwójne cytaty, na wypadek, gdyby w dokumentacji pojawiały się niechciane rozszerzenia
Digital Trauma
6

Możesz użyć wbudowanego nop: . Poza tym nie musisz przechowywać go jako zmiennej:

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

EDYCJA : Uważaj na znaki specjalne w swoich metadanych. Do czystego tekstu możesz użyć:

: <<EOT
Your metadata text here.
EOT

EDYCJA : Zamiast tego możesz użyć globalnej tablicy asocjacyjnej do przechowywania metadanych wszystkich funkcji:

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]}"
}

W ten sposób nie musisz analizować declareani typegenerować danych wyjściowych, a jedynie zapytać o klucz tablicy.

Luchostein
źródło
1
Uważaj - your metadata heremoże zawierać rozszerzenia, które mają skutki uboczne. Lepiej używać pojedynczych cytatów, takich jak odpowiedź @ AlexP.
Cyfrowy uraz
Tak, ale należy również zachować ostrożność w cudzysłowie.
Luchostein,
3

Możesz to zrobić.

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

źródło
ale funkcja powinna nadal działać po dodaniu adnotacji. W próbce, którą zawarłem, echo powinno nadal działać, gdy normalnie wywołuję tę funkcję.
yumper
@yucer To by. To tylko ilustracja. Spróbuj. Ma jednak swoje ograniczenia. Nie (można używać żadnych znaków specjalnych, a pierwsze słowo nie powinno być prawidłowym poleceniem.
Ok. Uważa, że ​​jest to poprawna odpowiedź, chociaż uruchomienie zajmuje więcej czasu. Również może być lepiej dołączyć echo i metadane, których użyłem w moim przykładzie.
yumper