環境:
コマンドを介して相互にやり取りする Bash スクリプトの大規模なセットによって管理されるインフラストラクチャのいくつかの部分がありsource
ます。これには、使用する標準の Bash テンプレートに準拠して作成されたファイルが含まれます (また、頻繁にチェーン インクルードが含まれます)。これはおそらく決して許されるべきではない状況であることはわかっていますが、それが私たちの現状です。
テンプレートは基本的に次のようになります。
set_params() {
#for parameters in a file that need to be accessed by other methods
#in that file and have the same value from initialization of that
#file to its conclusion:
global_param1=value
#left blank for variables that are going to be used by other methods
#in the file, but don't have a static value assigned immediately:
global_param2=
}
main_internals() {
#user-created code goes here.
}
main() {
set_params
#generic setup stuff/traps go here
main_internals arg arg arg
#generic teardown stuff goes here
}
この構造を使用して、コマンドを介してファイルに他のファイルをインクルードしsource
、インクルード ファイル メソッドを呼び出しますmain
。これにより、ほとんどの操作が適切にラップおよびモジュール化されます。
問題:
このインフラストラクチャに関する最も厄介な問題のいくつかは、同じsource
d チェーン/ファイル セット内の別の場所で無関係に使用されるグローバル変数名を使用する新しいモジュールがコードベースに追加されるときに発生します。myfile
つまり、file1.shに特定の目的で使用されるという変数があり、file2.sh を使用しsource
てさらに何かをmyfile
行う場合、file2.sh を書いている人はそれを知りません (多くの場合、できません)。多くのファイルが連鎖していることが予想されます)、file2.sh で呼び出される非ローカル変数myfile
を配置し、file1.sh の同じ名前の変数の値を変更する可能性があります。
質問:
local
グローバル変数名の競合が発生し、すべてを完全に解決できないと仮定すると、特定の関数またはその下の呼び出しの実行中にグローバルスコープで設定されたすべての変数をプログラムで設定解除する方法はありますか? 問題のスクリプトが保持している同じ名前の他の変数を設定解除せずに設定解除する方法はありますsource
か?
答えは「いいえ」である可能性が非常に高いですが、周りを見回して「変数名を追跡し、使い終わったら何かを設定解除する」以外に何も見つけられなかった後(これは必然的にコストのかかる間違いにつながります)、私は考えました私は尋ねます。
別の言い方をすると、Bash で 3 番目のスコープのように機能するものを作成/ハッキングする方法はありますか? 「関数に対してローカル」と「このファイルで実行されているすべてのファイルと、このファイルsource
によって実行されているすべてのファイルに表示される」の間の何か?