假设我有bash_functions.sh
:
function test(){
}
function test2(){
}
在我的~/.bashrc
我中:
source ~/bash_functions.sh
在采购时是否可以避免采购特定功能?我的意思是,将所有内容都来源于bash_functions.sh
,除了test
?
答案1
在函数定义中foo () { … }
,如果foo
是别名,则将其展开。有时这可能是一个问题,但在这里它有帮助。在获取文件之前使用其他名称的别名foo
,您将定义一个不同的函数。在 bash 中,别名扩展在非交互式 shell 中默认处于关闭状态,因此您需要使用shopt -s expand_aliases
.
如果sourced.sh
包含
foo () {
echo "foo from sourced.sh"
}
那么你就这样使用它
foo () {
echo "old foo"
}
shopt -s expand_aliases # necessary in bash; just skip in ash/ksh/zsh
alias foo=do_not_define_foo
. sourced.sh
unalias foo; unset -f do_not_define_foo
foo
然后你就得到了old foo
。请注意,源文件必须使用foo () { … }
函数定义语法,而不是function foo { … }
,因为function
关键字会阻止别名扩展。
答案2
但不完全是,您可以重写 test() 函数。最后一个函数定义始终优先。因此,如果您源文件test()
随后定义了一个同名函数,则后一个函数将覆盖源文件。我利用这一点在我的一些脚本中提供了一些面向对象的特性。
例子:
bash_functions.sh:
test(){
echo "This is the test function from bash_functions."
}
test2(){
echo "This is the test2 function from bash_functions."
}
scripty_scripterson.sh
test2(){
#this is thrown in just to show what happens in
#the other direction
echo "This is the test2 function from scripty."
}
source bash_functions.sh
test1(){
echo "This is the test1 function from scripty."
}
test1
test2
在命令行中:
$ ./scripty_scripterson.sh
This is the test1 function from scripty.
This is the test2 function from bash_functions.
答案3
您可以创建一个临时文件,将其读入,然后将其删除。要删除函数“test”,我假设函数内部没有“}”。
sed '/test()/,/}/d' testrc > ./tmprc && source ./tmprc && rm tmprc
答案4
那是不可能的。您可以将 bash_functions.sh 分成 2 个文件,一个包含您想要获取的文件,另一个包含您不想获取的函数。并使用第三个脚本文件将它们组合起来以供正常使用。