我经常生成并注册许多 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"
}
但不知何故巴什似乎在加载函数时忽略注释,而不是在执行函数时忽略注释。所以评论丢失了,我得到这个结果:
func1 is a function
func1 ()
{
echo "do my automation"
}
有没有办法将元数据分配给函数,然后检查它们?在使用类型检查定义时可以检索它吗?
答案1
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
是的,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"
}
答案3
您可以使用不内置:
。此外,您不需要将其存储为变量:
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]}"
}
这样,您不需要解析declare
ortype
的输出,而只需查询数组的键。
答案4
你可以这样做。
$ f() { This function does nothing. 2> /dev/null; }
$ f
$ type f
f is a function
f ()
{
This function does nothing. 2> /dev/null
}