在Bash中:如何发布包含方括号的函数名的函数定义?

时间:2017-09-14 18:54:53

标签: bash centos7 declare

在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也将包括在内。)

所以,我的问题是:

  • 是否可以使用Bash 4.2.46(1)-release通过其他机制为包含括号字符的函数名发出函数定义?
  • 是否可以使用Bash 4.4.0(1)-release?
  • 这是一个错误吗?

此问题特定于函数名称中的方括号。

0 个答案:

没有答案