4

shスクリプトを作成するとき、スクリプトの最後で以前に定義されたすべてのグローバル変数の設定を解除することは良い習慣と見なされますか?

たとえば、をmyscript使用してスクリプトを実行する場合。(ソース)ビルトイン、このように

. myscript

スクリプトを実行した後、シェルはスクリプトで定義された変数で汚染されます。これは本当に悪いようです(特に他の人が使用する場合)。

可能であれば、sh(またはbash)のグローバルを完全に削除しますが、多くの場合、それらは最悪の解決策ではありません:-)。

4

3 に答える 3

10

これは実際にはスクリプトを実行していません。それを調達しているので、シェルはスクリプト内の各コマンドを実行します。スクリプトを実行する場合は、次のようにします。

./myscript

その場合、スクリプト内に設定されている環境変数はいずれもシェルに影響を与えません。

スクリプトをソース化して、環境変数の設定や現在のディレクトリの変更などを実行できるようにする必要がある場合は、括弧を使用してサブシェル内の変数を分離できます。

(
  a=7
  echo $a
)
# The change in a doesn't get to here

使用する変数の設定を解除すると、逆の問題が発生します。同じ名前の変数がユーザーによって設定されていた場合、それを破棄することになります。

于 2012-10-21T14:08:21.213 に答える
2

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を使用するように環境を構成するため)、これは現実的ではありません。

通常のスクリプト(ソースを意図していないスクリプト)を使用して変数のクリーンアップを行いません。しかし、ソース可能なスクリプトの場合、それは重要だと思います。誰もが私に同意するのではないかと思います。多くの人はおそらくそれほど気にすることができませんでした。しかし、私はあなたに同意します—ソースされたスクリプトがクリーンであることが重要です。

于 2012-10-21T14:38:08.493 に答える
1

必ずしも。

スクリプトを実行すると、新しいシェルが実行され、そのスクリプトが親シェルに影響を与えないように変数が設定されます。

(スクリプト内ではなく)シェル自体でのみ実行. myscriptすると、設定された変数が有効になり、前述のようにシェルが汚染される可能性があります。

于 2012-10-21T14:07:03.960 に答える