Bashからファイルをインポートしますが、特定の機能をスキップできますか?

Bashからファイルをインポートしますが、特定の機能をスキップできますか?

私が持っているとしましょうbash_functions.sh

function test(){
}

function test2(){
}

私の中~/.bashrc

source ~/bash_functions.sh

購入時に特定の機能購入を省略できますか?私の言葉はbash_functions.shtest

答え1

関数定義でエイリアスのfoo () { … }場合はfoo拡張されます。時にはこれが問題になるかもしれませんが、ここでは役に立ちます。ファイルをインポートする前に別の名前のエイリアスを使用すると、foo他の機能が定義されます。 Bashでは、非対話型シェルでエイリアス拡張がデフォルトでオフになっているので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つのファイルに分割できます。 1つはインポートするファイルを含み、もう1つはインポートしない機能を含みます。 3番目のスクリプトファイルを使用して、一般的な使用のために結合します。

関連情報