可以在Bash中扩展功能吗?

时间:2014-08-07 04:46:02

标签: bash

如果我在文件中定义一个函数,请说 test1.sh

#!/bin/bash

foo() {
    echo "foo"
}

在第二个 test2.sh 中,我尝试重新定义foo

#!/bin/bash

source /path/to/test1.sh    
...
foo() {
    ...
    echo "bar"
}
foo

有没有办法改变 test2.sh 来生成:

foo
bar

我知道使用command可以使用Bash内置函数,但我想知道是否可以扩展用户函数?

4 个答案:

答案 0 :(得分:3)

我不知道这样做的好方法(但我很乐意被证明是错的)。

这是一种丑陋的方式:

# test2.sh
# ..
eval 'foo() {
        '"$(declare -f foo | tail -n+2)"'

        echo bar
      }'

答案 1 :(得分:2)

不,不可能。新声明将覆盖函数的上一个实例。但是,尽管没有这种功能,当你想要禁用一个功能时它仍然有用,而不必像以下那样取消它:

foo() {
    :  ## Do nothing.
}

它也有助于延迟初始化:

foo() {
    # Do initializations.
    ...

    # New declaration.
    if <something>; then
        foo() {
            ....
        }
    else
        foo() {
            ....
        }
    fi

    # Call normally.
    foo "$@"
}

如果您勇敢且有足够的能力使用eval,您甚至可以优化您的功能,以便根据条件在没有额外if的情况下采取行动。

答案 2 :(得分:1)

我不确定是否需要做这样的事情。你可以在函数内部使用函数,那么为什么只要在新创建的函数中调用原始的sourced函数就可以重用这个名字,如下所示:

AirBoxOmega:stack d$ cat source.file
#!/usr/local/bin/bash

foo() {
    echo "foo"
}
AirBoxOmega:stack d$ cat subfoo.sh
#!/usr/local/bin/bash


source /Users/d/stack/source.file
sub_foo() {
  foo
  echo "bar"
}

sub_foo
AirBoxOmega:stack d$ ./subfoo.sh
foo
bar

当然,如果你真的心里想要修改,你可以在新功能中找到你的功能,调用它,然后做一些事情,比如:

AirBoxOmega:stack d$ cat source.file
#!/usr/local/bin/bash

foo() {
    echo "foo"
}
AirBoxOmega:stack d$ cat modify.sh
#!/usr/local/bin/bash


foo() {
  source /Users/d/stack/source.file
  foo
  echo "bar"
}

foo
AirBoxOmega:stack d$ ./modify.sh
foo
bar

答案 3 :(得分:0)

是的,

请参阅此页面:https://mharrison.org/post/bashfunctionoverride/

    save_function() {
        local ORIG_FUNC=$(declare -f $1)
        local NEWNAME_FUNC="$2${ORIG_FUNC#$1}"
        eval "$NEWNAME_FUNC"
    }

    save_function foo old_foo
    foo() {
        initialization_code()
        old_foo()
        cleanup_code()
    }