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

Modified on: Sat, 30 Jun 2018 08:15:00 +0800

假设我有bash_functions.sh

function test(){
}

function test2(){
}

在我的~/.bashrc中,我做了:

source ~/bash_functions.sh

在采购时,是否有可能避免采购特定功能?我的意思是,在bash_functions.sh中找到所有内容,但test除外?

最佳答案

在函数定义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关键字会阻止别名扩展。

作者:Gilles

相关问答

添加新评论