最近、環境変数を設定する3つのオプションがあることに気付きました。
export envVar1=1
setenv envVar2=2
env envVAr3=3
他にも方法があれば教えてください。
どちらを優先するべきですか?ガイドラインを提案してください。
シェルの互換性について、どれが最も拡張的ですか(より多くのシェル方言をカバーします)?
私はすでにこれに気付いた answer ですが、env
と使用設定のガイドラインで質問を拡大したいと思います。
export VARIABLE_NAME='some value'
は、POSIX準拠のシェルで環境変数を設定する方法です(sh
、dash
、bash
、ksh
など。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
は、mycommand
をVAR
に設定して、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
です。