如果我在文件中定义一个函数,请说 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内置函数,但我想知道是否可以扩展用户函数?
答案 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()
}