script1.sh と script2.sh の両方の名前は同じですが、定義が異なる関数を含む場合、その関数が script1.sh で実行されると、script2.sh は script1.sh から始まります。どの関数が呼び出されますか?
私はこのケースをシミュレートしようとしています。 script1.shで関数を実行すると、script1.shで定義された関数のみが使用されます。しかし、この動作はすべての状況で一貫していますか?
script1.sh
#!/bin/bash
source script2.sh
execute() {
echo "Hello"
}
execute
script2.sh
#!/bin/bash
execute() {
echo "Something"
}
答え1
この場合、関数を変数として扱うことができます。つまり、関数に割り当てた最後の値を持つことになります。以下の場合があります。
var=foo
var=bar
var=baz
echo "$var"
上記の場合、変数に値が割り当てられるたびに古い値が上書きされるため、echo "$var"
これが印刷されることは明らかです。baz
機能は同じ方法で動作します。同じ名前の関数が複数回定義されると、最後の定義のみが関連付けられ、他の定義は失われます。
購入しても変わるわけではありません。ファイルから関数をインポートし、同じ名前で新しい関数をオーバーライドすると、新しい関数のみが機能します。逆に、スクリプトで関数を定義し、同じ名前の関数を使用してファイルをインポートする場合は、インポートされたファイルのみが有効です。
はい。完全に一貫性があり、作業順序に従って実際に使用されるものが定義されます。
答え2
完全性のために両方の機能を使用するには、名前空間を使用できるksh93(シェルbashがエミュレートしようとする)に切り替えます。
以下を行う代わりに:
source script2.sh
(ところで、bashではkshと同じように何もしないかもしれません。)以下を実行してくださいscript2.sh
。$PATH
namespace script2 {
source ./script2.sh # the one in the current directory not in $PATH!
}
function execute {
echo "Hello"
}
execute # the one from the global namespace
.script2.execute # the one from the script2 namespace
変数も名前空間として指定されることに注意してください。