web-dev-qa-db-ja.com

env、setenv、exportと使用するタイミングの違いは何ですか?

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

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

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

どちらを優先するべきですか?ガイドラインを提案してください。

シェルの互換性について、どれが最も拡張的ですか(より多くのシェル方言をカバーします)?

私はすでにこれに気付いた answer ですが、envと使用設定のガイドラインで質問を拡大したいと思います。

19
Maroshi

export VARIABLE_NAME='some value'は、POSIX準拠のシェルで環境変数を設定する方法です(shdashbashkshなど。zshも)。変数にすでに値がある場合は、export VARIABLE_NAMEを使用して、値を変更せずに変数を環境変数にすることができます。

Pre-POSIX Bourne shells はこれをサポートしていませんでした。そのため、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 lines を除いてほとんど役に立ちません。引数なしで呼び出された場合、環境を表示しますが、exportの方が優れています(並べ替えられ、値の改行と値を区切る改行を区別するために引用されることがよくあります)。引数を指定して呼び出すと、追加の環境変数を使用してコマンドが実行されますが、envを使用しない同じコマンドも機能します(VAR=value mycommandは、mycommandVARに設定して、env VAR=value mycommandと同じようにvalueを実行します)。 envがシバン行で役立つ理由は、PATHルックアップを実行し、コマンド名で呼び出されたときに何も実行しないためです。 envコマンドは、-iを使用した環境変数をいくつか、またはパラメーターを使用せずにコマンドを実行して、シェルがインポートしない無効な名前の変数を含む環境を表示するのに役立ちます。

VAR='asdf'のような変数を設定しても、環境は変更されません。つまり、同じセッションで起動するプログラムはVARについて何も認識せず、それにアクセスできなくなります。シェルスクリプトを記述するときにこの動作が必要です。

一方、exportはbashビルトインであり、環境を変更して、現在のセッションで生成された子プロセスでエクスポートされた変数を表示できるようにします。 VAR='asdf' %program_name%を実行すると、同じことができます。

envは組み込みではなく、プログラム自体です。表面的には、VAR='asdf' %program_name%とまったく同じように機能しますが、下位レベルでは、少し複雑になります。まず、envが起動します。環境を変更し、指定された引数でコマンドを実行します。 exec(3) システムコールを使用して、独自のコードで達成できる同じ動作。

setenvは、回答に記載されているように、cshファミリシェルではexportです。

3
user230253
2
Kusalananda