分配和检查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

Answers:


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
嗯,bash中的文档字符串。谁知道?
布赖恩·明顿

有什么办法可以查询该评论?我在考虑所有命令的通用帮助功能。
yucer

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(){:“ metadata”
#do

1
我认为单引号比双引号要好,以防万一在文档字符串中隐藏了任何不必要的扩展
Digital Trauma

6

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

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

编辑:当心特殊字符进入您的元数据。对于纯文本,可以使用:

: <<EOT
Your metadata text here.
EOT

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

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

这样,您就无需解析declaretype输出,而只需查询数组的键。


1
小心- your metadata here可能包含有副作用的扩展。最好使用单引号,例如@AlexP的答案。
Digital Trauma

是的,但是在引号内也要小心。
Luchostein '16

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 '16

@yucer会的。这只是一个例子。试试看。它有其局限性。(不能使用类似这样的特殊字符,并且第一个单词不应是有效命令。

好。它认为这是一个有效的答案,尽管运行需要花费额外的时间。另外,最好包含示例中使用的回显和元数据。
yucer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.