env、setenv、exportといつ使用するかの違いは何ですか?

最近、環境変数を設定するための3つのオプションがあることに気付きました:

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

他の方法がある場合は、私たちに教えてください。

どちらを優先する必要があるのはいつですか?ガイドラインを提案してください。

最も拡張性の高い(より多くのシェル方言をカバーする)シェルの互換性については?

この回答ですが、envと使用設定のガイドラインを使用して質問を拡張したいと思います。

回答

export VARIABLE_NAME="some value"は、POSIX準拠のシェル(shdashbashkshなど。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 mycommandVARが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シェルでは'ではありませんでした。)

回答

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です