Zuweisen und Überprüfen von Bash-Funktionsmetadaten

10

Ich generiere und registriere oft viele Bash-Funktionen, die viele der Aufgaben automatisieren, die ich normalerweise in meinen Entwicklungsprojekten erledige. Diese Generation hängt von den Metadaten des Projekts ab, an dem ich arbeite.

Ich möchte die Funktionen mit den Informationen des Projekts, das sie generiert haben, folgendermaßen versehen:

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

Im Idealfall kann ich den Kommentar sehen, wenn ich die Definition überprüfe:

$ type func1

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

Aber irgendwie scheint bash die Kommentare beim Laden der Funktion zu ignorieren, nicht beim Ausführen. Die Kommentare gehen also verloren und ich erhalte das folgende Ergebnis:

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

Gibt es eine Möglichkeit, Funktionen Metadaten zuzuweisen und diese anschließend zu überprüfen? Ist es möglich, es abzurufen, wenn die Definition mit Typ überprüft wird?

yucer
quelle
1
Keine Lösung (daher der Kommentar), aber die Umgehung, die ich verwende, besteht darin, zu überprüfen, ob dies der Fall $1ist -h, und dann printf/ echoeine einzeilige Hilfe / Verwendung / was auch immer.
John N
2
Siehe auch: unix.stackexchange.com/questions/295022/…
Jeff Schaller

Antworten:

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
quelle
2
hmmm, docstrings in bash. Wer wusste?
Brian Minton
Gibt es eine Möglichkeit, diesen Kommentar abzufragen? Ich denke an eine generische Hilfefunktion für alle Befehle.
Yucer
7

Ja, typescheint nur die Teile einer Funktion auszudrucken, die ausgeführt werden sollen. Das scheint mir wirklich vernünftig zu sein, da das normalerweise alles ist, woran Sie interessiert sind, wenn Sie Fragen stellen type.

Um dieses Problem zu umgehen, fügen Sie anstelle von Kommentaren Ihre Metadaten wie folgt hinzu:

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

Es ist nicht erforderlich, diese Variable jemals tatsächlich zu verwenden, sie wird jedoch angezeigt, wenn die Funktion abgefragt wird mit type:

$ type func1
func1 is a function
func1 () 
{ 
    meta="This function was generated for project: PROJECT1";
    echo "do my automation"
}
terdon
quelle
2
Wenn Sie das Speichern einer Variablen vermeiden möchten, können Sie den nop-Operator ":" folgendermaßen verwenden: function func () {: "metadata" # do yours}
Luchostein
1
Ich denke, einfache Anführungszeichen sind hier besser als doppelte Anführungszeichen, nur für den Fall, dass sich unerwünschte Erweiterungen in der Dokumentenkette verstecken
Digital Trauma
6

Sie können die Verwendung nop builtin :. Außerdem müssen Sie es nicht als Variable speichern:

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

BEARBEITEN : Achten Sie auf Sonderzeichen in Ihren Metadaten. Für reinen Text können Sie verwenden:

: <<EOT
Your metadata text here.
EOT

BEARBEITEN : Sie können stattdessen ein globales assoziatives Array verwenden, um alle Metadaten der Funktion zu speichern:

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

Auf diese Weise müssen Sie nicht die Ausgabe von declareoder analysieren type, sondern nur den Schlüssel eines Arrays abfragen.

Luchostein
quelle
1
Seien Sie vorsichtig - your metadata herekann Erweiterungen enthalten, die Nebenwirkungen haben. Verwenden Sie lieber einfache Anführungszeichen wie die Antwort von @ AlexP.
Digitales Trauma
Ja, aber Sie sollten auch in Anführungszeichen vorsichtig sein.
Luchostein
3

Du kannst das.

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

quelle
Aber die Funktion sollte nach dem Kommentieren immer noch ihre Arbeit erledigen. In dem Beispiel, das ich aufgenommen hatte, sollte das Echo immer noch funktionieren, wenn ich die Funktion normal aufrufe.
Yucer
@yucer Es würde. Dies ist nur eine Illustration. Versuch es. Es hat jedoch seine Grenzen. Es (können keine Sonderzeichen wie verwendet werden und das erste Wort sollte kein gültiger Befehl sein.
In Ordnung. Es ist eine gültige Antwort, obwohl die Ausführung eine zusätzliche Zeit in Anspruch nimmt. Es könnte auch besser sein, das Echo und die Metadaten einzuschließen, die ich in meinem Beispiel verwendet habe.
Yucer