是否可以在 bash 中获取文件,但跳过特定功能?

是否可以在 bash 中获取文件,但跳过特定功能?

假设我有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 个文件,一个包含您想要获取的文件,另一个包含您不想获取的函数。并使用第三个脚本文件将它们组合起来以供正常使用。

相关内容