私が持っているとしましょうbash_functions.sh
:
function test(){
}
function test2(){
}
私の中~/.bashrc
:
source ~/bash_functions.sh
購入時に特定の機能購入を省略できますか?私の言葉はbash_functions.sh
、test
?
答え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番目のスクリプトファイルを使用して、一般的な使用のために結合します。