分配和检查 bash 函数元数据

yuc*_*cer 10 bash function

我经常生成和注册许多 bash 函数,这些函数可以自动执行我在开发项目中经常执行的许多任务。那一代取决于我正在从事的项目的元数据。

我想用它们生成的项目的信息来注释函数,这样:

func1() {
# This function was generated for project: PROJECT1
echo "do my automation"
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,当我检查定义时,我将能够看到评论:

$ type func1

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

但不知何故bash似乎在加载函数时忽略了注释,而不是在执行它时。所以评论丢失了,我得到了这个结果:

func1 is a function
func1 () 
{
    echo "do my automation"
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将元数据分配给函数,然后再检查它们?使用类型检查定义时可以检索它吗?

Ale*_*exP 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
}
Run Code Online (Sandbox Code Playgroud)

  • 嗯,bash 中的文档字符串。谁知道? (2认同)

ter*_*don 7

是的,type似乎只打印出将运行的函数的部分。这对我来说似乎是合理的,真的,因为通常这就是您在查询type.

作为一种解决方法,不要使用注释,而是像这样添加元数据:

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

没有必要实际使用该变量,但它会在查询函数时出现type

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

  • 如果你想避免存储一个变量,你可以这样使用 nop 操作符 ":": function func() { : "metadata" # do yours } (2认同)

Luc*_*ein 6

您可以使用nop内置:。此外,您不需要将其存储为变量:

function f() {
  : your metadata here
  : "or here"
  # do yours
}
Run Code Online (Sandbox Code Playgroud)

编辑:注意元数据中的特殊字符。对于纯文本,您可以使用:

: <<EOT
Your metadata text here.
EOT
Run Code Online (Sandbox Code Playgroud)

编辑:您可以使用全局关联数组来存储所有函数的元数据:

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]}"
}
Run Code Online (Sandbox Code Playgroud)

这样,您不需要解析declareortype的输出,而只需查询数组的键。