ソーススクリプトの機能動作

ソーススクリプトの機能動作

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

変数も名前空間として指定されることに注意してください。

関連情報