バッシュ4.4.20を使用しています。私は通常、すべてのbashスクリプトに主な機能を持っています。他のbashスクリプトの他の関数からこのスクリプトをインポートしたい場合は、両方のスクリプトの基本関数定義と競合しますか?
#A.sh
main() {
SomeFunction
}
SomeFunction(){
. B.sh
}
main "$@"
#B.sh
main(){
echo Hi
}
main "$@"
主な機能の名前を変更せずに解決策はありますか?
答え1
別のスクリプトが上書きされますmain()
。はい。この特別なケースでは、main()
スクリプトAの実行中にスクリプトBが関数をオーバーライドするので、これが重要かどうかはわかりません。シェルがすでに実行中の関数の動作をオーバーライドできるようにするかどうか疑問に思われます。
つまり、次のスクリプトが提供されます。
$ cat a.sh
main() {
echo a1
. ./b.sh
echo a2
}
main "$@"
$ cat b.sh
main() {
echo b
}
main "$@"
どのシェルでも実行すると、print、、、a.sh
を見つけることができます。もう一度呼び出すと、もちろん新しい動作が発生します。a1
b
a2
a.sh
main
しかし、ここでは重要ではありませんが、このような関数を動的にオーバーライドすることは少なくとも混乱します。
より良い質問は、なぜあなたが必要ですか?源泉最初のスクリプトB? Bを調達を通じてロードされる関数の集合(一種のライブラリ)と考えることがより明確に見えます。またはソースではなく汎用プログラムと呼ばれるスタンドアロンユーティリティとして扱います。
最初のケースでは、Aは必要に応じてAで定義されている関数を明示的に呼び出します。
答え2
短い答え はい
長い答え スクリプトを取得すると、スクリプトを実行するのと同じですが、独自のシェルプロセスで実行されます。したがって、環境変数、関数名などが共有されます。バラよりhttps://superuser.com/a/176788/222230