designe e inspecione os metadados da função bash

10

Eu geralmente gero e registro muitas funções bash que automatizam muitas das tarefas que normalmente faço em meus projetos de desenvolvimento. Essa geração depende dos meta-dados do projeto em que estou trabalhando.

Eu quero anotar as funções com as informações do projeto que elas geraram, desta forma:

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

Idealmente, eu seria capaz de ver o comentário quando inspecionar a definição:

$ type func1

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

Mas, de alguma forma, o bash parece ignorar os comentários no momento de carregar a função, não ao executá-la. Então os comentários são perdidos e eu recebo este resultado:

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

Existe alguma maneira de atribuir metadados a funções e verificá-las depois? É possível recuperá-lo ao inspecionar a definição com o tipo?

    
por yucer 09.12.2016 / 12:26

4 respostas

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
}
    
por 09.12.2016 / 16:10
7

Sim, type parece imprimir apenas as partes de uma função que será executada. Isso parece razoável para mim, na verdade, já que geralmente é tudo o que você está interessado em consultar type .

Como solução alternativa, em vez de usar comentários, adicione seus metadados da seguinte forma:

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

Não há necessidade de realmente usar essa variável, mas ela aparecerá ao consultar a função com type :

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

Você pode usar o nop incorporado em : . Além disso, você não precisa armazená-lo como uma variável:

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

EDITAR : Cuidado com caracteres especiais em seus metadados. Para texto puro, você pode usar:

: <<EOT
Your metadata text here.
EOT

EDIT : você pode usar uma matriz associativa global para armazenar todos os metadados da função:

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

Dessa forma, não é necessário analisar a saída de declare ou type , mas apenas consultar a chave de uma matriz.

    
por 09.12.2016 / 16:22
3

Você pode fazer isso.

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

Tags