实现本地功能

时间:2016-01-25 04:57:47

标签: bash shell sh

我想要实现的是在函数中创建本地函数。同时,本地函数不会覆盖外部函数。下面是一个简单函数和带有参数的嵌套函数的示例,用于说明我的问题。

#!/bin/bash
usage() #<------------------------------- same function name
{
    echo "Overall Usage"
}

function_A()
{
    usage() #<--------------------------- same function name
    {
        echo "function_A Usage"
    }

    for i in "$@"; do
        case $i in
            --help)
                usage
                shift
                ;;
            *)
                echo "flag provided but not defined: ${i%%=*}"
                echo "See '$0 --help'."
                exit 0
            ;;
        esac
    done
}

function_A --help
usage

这是输出。

function_A Usage
function_A Usage

但我想要的是

function_A Usage
Overall Usage

是否可以在不改变其(功能)名称和顺序的情况下实现?请?

注意:我尝试了local usage(),但它似乎不适用于功能。

3 个答案:

答案 0 :(得分:12)

Bash不支持本地功能,但根据您的特定脚本和架构,您可以通过子shell控制功能名称的范围。

通过在定义中将{..}替换为(..),您将获得所需的输出。 usage的新定义仅限于该功能,但例如变量的任何变化:

#!/bin/bash
usage() 
{
    echo "Overall Usage"
}

function_A()
(                  # <-- Use subshell
    usage()
    {
        echo "function_A Usage"
    }

    for i in "$@"; do
        case $i in
            --help)
                usage
                shift
                ;;
            *)
                echo "flag provided but not defined: ${i%%=*}"
                echo "See '$0 --help'."
                exit 0
            ;;
        esac
    done
)

function_A --help
usage

答案 1 :(得分:1)

来自man bash

  

复合命令

     

复合命令是以下命令之一:

     

(列表)列表在子Shell环境中执行(请参见下面的“命令执行环境”)。在命令完成后,影响外壳环境的变量分配和内置命令将保持无效。返回状态是列表的退出状态。   ...

  1. 假设我们有test.sh:
#!/usr/bin/sh

topFunction1() {
    # start subshell
    (


        innerFunction1() {
            echo "innerFunction1"
        }

        echo "topFunction1 can call $(innerFunction1) from within the subshell"


    )
    # end subshell


    innerFunction2() {
        echo "innerFunction2"
    }
}

topFunction2() {
    echo "topFunction2"
}
  1. 现在开始做source test.sh

以下命令成功执行:

topFunction2

以下命令失败:

innerFunction1

innerFunction2

  1. 现在,如果我们执行topFunction1,我们将得到包含innerFunction1输出的输出:
      

    topFunction1可以从子shell内调用innerFunction1

此时,以下命令已成功完成:

topFunction1

topFunction2

innerFunction2

人们可以注意到,现在innerFunction2在调用topFunction1之后在全局可见。 但是innerFunction1仍然是“隐藏”的子外壳调用,这可能是您想要的。

innerFunction1的另一个调用将失败。

答案 2 :(得分:0)

扩展that other guy的答案:

$ function zz() (:;)

$ declare -f zz

zz ()
{
    ( : )
}

您会看到,用括号而不是花括号来定义函数只是用括号括住函数的整个内部的简写。该功能实际上以其长格式进行标识。

https://www.tldp.org/LDP/abs/html/subshells.html https://www.gnu.org/software/bash/manual/html_node/Command-Grouping.html#Command-Grouping