env、setenv、エクスポートと使用時期の違いは何ですか?

env、setenv、エクスポートと使用時期の違いは何ですか?

最近、環境変数の設定には3つのオプションがあることがわかりました。

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

他の方法があれば教えてください。

いつ他のものよりも1つを選択する必要がありますか?ガイドラインを提案してください。

シェルの互換性に関して、どれが最も広範囲ですか(より多くのシェル方言を含む)?

私はこれに気づいた回答envしかし、私は好みガイドを使ってこの質問を拡張したいと思います。

答え1

export VARIABLE_NAME='some value'shPOSIX互換シェル(、、dashなどbash、zsh)kshで環境変数を設定する方法。変数にすでに値がある場合は、export VARIABLE_NAME値を変更せずに環境変数にすることができます。

POSIX 以前のバージョンボンシェルこれはサポートされていないため、export VARIABLE_NAME='some value'代わりに使用せずに使用するスクリプトが表示されますVARIABLE_NAME='some value'; export VARIABLE_NAME。しかし、POSIX以前のBourneシェルは今日非常にまれです。

setenv VARIABLE_NAME='some value'環境変数を設定するためのcsh構文。setenvshには存在せず、cshはスクリプトでほとんど使用されず、過去20年間(zshはより長い間)対話型の使用でbashを上回ったため、遭遇しない限り忘れることができます。

このenvコマンドは、以下を除いてほとんど役に立ちません。シェルボーンライン。引数なしで呼び出すと、環境が表示されますが、exportより良いです(値の改行と値を区切る改行を明確にするために並べ替えられ、しばしば引用されます)。引数を使用して呼び出すと、追加の環境変数を使用してコマンドを実行しますが、env同じコマンドなしで動作します(VAR=value mycommand例:set toとして実行)。 Shebang行が役に立つ理由は、照会を実行し、コマンド名で呼び出されたときに他の操作を実行しないためです。このコマンドは、シェルがインポートしない無効な名前の変数を含む環境を表示するために、いくつかの環境変数(引数を含むまたは除く)のみを含むコマンドを実行するために使用できます。mycommandVARvalueenv VAR=value mycommandenvPATHenv-i

答え2

環境変数などの変数を変更せずに設定するとは、VAR='asdf'同じセッションで開始されたプログラムがこれについて何も知らず、VARアクセスできないことを意味します。シェルスクリプトを作成するときにこの動作が必要です。

export一方、エクスポートされた変数が現在のセッションで作成された子プロセスに表示されるように環境を変更するbash組み込みコマンド。を実行して同じ結果を得ることができますVAR='asdf' %program_name%

env組み込みプログラムではなく、別のプログラムです。表面的にはあなたと同じように機能しますVAR='asdf' %program_name%が、低レベルでは状況がより複雑になります。まず、env始めましょう。環境を変更し、指定されたパラメーターを使用してコマンドを実行します。以下を使用して、独自のコードで同じ動作を達成できます。実行(3)システムコール。

setenvexport答えが示すように、csh-familyシェルでのみ可能です。

答え3

関連情報