最近、環境変数を設定するための3つのオプションがあることに気付きました:
-
export envVar1=1
-
setenv envVar2=2
-
env envVAr3=3
他の方法がある場合は、私たちに教えてください。
どちらを優先する必要があるのはいつですか?ガイドラインを提案してください。
最も拡張性の高い(より多くのシェル方言をカバーする)シェルの互換性については?
この回答ですが、env
と使用設定のガイドラインを使用して質問を拡張したいと思います。
回答
export VARIABLE_NAME="some value"
は、POSIX準拠のシェル(sh
、dash
、bash
、ksh
など。zshも)。変数にすでに値がある場合は、export VARIABLE_NAME
を使用して、値を変更せずに環境変数にすることができます。
POSIX以前 Bourneシェルはこれをサポートしていませんでした。そのため、export VARIABLE_NAME="some value"
を回避し、VARIABLE_NAME="some value"; export VARIABLE_NAME
。ただし、POSIX以前のBourneシェルは、最近では非常にまれです。
setenv VARIABLE_NAME="some value"
は、環境変数を設定するためのcsh構文です。setenv
はshには存在せず、cshがスクリプトで使用されることは非常にまれであり、過去20年間(およびzshはさらに長い間)インタラクティブに使用するためにbashに追い抜かれているため、忘れることができます。
env
コマンドは、 shebang行を除いて、ほとんど役に立ちません。引数なしで呼び出されると、環境が表示されますが、export
の方が優れています(並べ替えられ、多くの場合、disambiguaに引用されます)値を区切る改行からの値の改行)。引数を指定して呼び出すと、追加の環境変数を使用してコマンドを実行しますが、env
を使用しない同じコマンドも機能します(VAR=value mycommand
はividを実行しますenv VAR=value mycommand
divと同様に、VAR
がvalue
に設定された= “89bd68d2e8″>
>)。 env
がシバン行で役立つ理由は、PATH
ルックアップを実行し、コマンドで呼び出されたときに他に何もしないためです。名前。 env
コマンドは、-i
を使用して、または変数を含む環境を表示するパラメーターを使用せずに、いくつかの環境変数のみを使用してコマンドを実行する場合に役立ちます。シェルがインポートしない無効な名前を使用します。
回答
VAR="asdf"
は環境を変更せずに残します。つまり、同じセッションで起動するプログラムはVAR
について何も知らず、アクセスできなくなります。シェルスクリプトを作成するときにこの動作が必要です。一方、。
export
は、環境を変更して、エクスポートされた変数を現在のセッションで生成された子プロセスで表示できるようにするbashビルトインです。 VAR="asdf" %program_name%
を実行することで同じことを実現できます。
env
は組み込みではなく、それ自体がプログラムです。 VAR="asdf" %program_name%
ですが、下位レベルでは状況が少し複雑になります。まず、env
が起動します。環境を変更し、指定された引数を使用してコマンドを実行します。 exec(3)システムコールを使用して独自のコードで実現できるのと同じ動作。
setenv
は、回答に記載されているように、csh-familyシェルではexport
です。
コメント
回答
これに答える答えを含むいくつかの質問があります:
(など)
VAR
がすでに環境に存在する場合、VAR=asdf
は環境を更新します。 (これは、元のBourneシェルでは'ではありませんでした。)