shスクリプトを作成するとき、スクリプトの最後で以前に定義されたすべてのグローバル変数の設定を解除することは良い習慣と見なされますか?
スクリプトが正常に実行されている場合(サブシェルで、を使用してmyscript
)、スクリプトで定義されている変数(または関数)について心配する必要はありません。スクリプトが実行を停止すると、呼び出し元のシェルに損傷を与えることなく、それらは消えます。
たとえば、次のように、組み込みの.
( )を使用してスクリプトmyscriptを実行するとします。source
. myscript
スクリプトを実行した後、シェルはスクリプトで定義された変数で汚染されます。これは本当に悪いようです(特に他の人が使用する場合)。
ソースされるスクリプトには、ソースされる非常に正当な理由が必要です(特定の環境変数の設定またはディレクトリの変更が通常の理由です)。他の人が使用するこのようなスクリプトは、偶然に設定する変数の設定を解除することに熱心である必要があります。最初に明確に名前が付けられた変数を使用するように注意し、完了時にすべての設定を解除します。
または、少なくとも、シェルに変数が散らかっている場合は、他の人のスクリプトを入手しません。「プロファイル」操作以外でファイルをソースすることはあまりありませんが、ソースを作成する場合、スクリプトは特定の変数を設定するように設計されています。それらを設定することができます(そうでない場合は役に立ちません)。ただし、他の変数のランダムな組み合わせを追加しない方がよいでしょう。必要に応じて、相手の台本をコピーして自分用にサニタイズするか、サニタイズ台本で包みます。
PATHを設定するために使用するスクリプトがあります(したがって、有用であるためには、多かれ少なかれソースが必要です)。始まる:
ps_machine=$(uname -n)
ps_pathset=no
ps_pathoptsfile=
for ps_file in \
${HOME}/.pathopts.$ps_machine \
${REAL_HOME:-$HOME}/.pathopts.$ps_machine \
${HOME}/.pathopts \
${REAL_HOME:-$HOME}/.pathopts
do
...40 lines of esoteric code...
...some set ps_perl; some set ps_pathopts...
done
...5 lines of active code that set PATH...
unset ps_pathset ps_pathoptsfile ps_pathopts ps_file ps_perl ps_machine
私はこれを次のように呼び出します:
. mcpathset
このコマンドの代替設計は次のとおりです。
export PATH=$(mcpathset)
ここでは、コマンドの出力がPATHの新しい値として使用されます。変数を1つだけ設定する必要がある場合、これは実行可能な設計です。環境変数のスイートを設定する必要がある場合(たとえば、特定のDBMSを使用するように環境を構成するため)、これは現実的ではありません。
通常のスクリプト(ソースを意図していないスクリプト)を使用して変数のクリーンアップを行いません。しかし、ソース可能なスクリプトの場合、それは重要だと思います。誰もが私に同意するのではないかと思います。多くの人はおそらくそれほど気にすることができませんでした。しかし、私はあなたに同意します—ソースされたスクリプトがクリーンであることが重要です。