在Bash中,declare -f <functionName>
可用于发出函数定义。我想使用它,因为我正在编写代码以允许我使用Bash注释来修改函数内容。
我遇到了一个问题,因为可以使用一些允许的函数名,但是它们的定义不能发出。下面的代码演示了不能发出包含方括号的函数名,而可以发出其他带有特殊字符的名称。
demo.sh
#!/bin/bash
main()
{
# Gather function names
local SourceFile="$1"
local FunctionNames
FunctionNames=(
$(
bash <(
cat "$SourceFile"
echo 'declare -F'
) 2>&1 |
grep 'declare -f' |
sed 's|.* ||'
)
)
# Show function names and that special characters work
printf 'Function: %s\n' "${FunctionNames[@]}"; echo
. "$SourceFile"
test.
echo
# Show function definitions
local FunctionName
for FunctionName in "${FunctionNames[@]}"; do
echo "$(
bash <(
cat "$SourceFile"
echo "declare -f '$FunctionName'"
)
)"
done
}
main "$@"
testdata.sh
#!/bin/bash
f:()
{
echo "In f:"
}
f[]()
{
echo "In f[]"
}
test.()
{
echo "In test."
f:
f[]
}
调用
$ ./demo.sh testdata.sh
Function: f:
Function: f[]
Function: test.
In test.
In f:
In f[]
f: ()
{
echo "In f:"
}
/dev/fd/63: line 19: declare: `f[]': not a valid identifier
test. ()
{
echo "In test.";
f:;
f[]
}
我已经在CentOS 7上使用Bash 4.2.46(1)-release和Bash 4.4.0(1)测试了这个 - 我发布了源代码。在这两种情况下都会发生上述行为。
注意:上面<()
和$()
的使用用于确保只处理$SourceFile
中的那些函数(否则会在demo.sh也将包括在内。)
所以,我的问题是:
此问题特定于函数名称中的方括号。