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


18

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

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

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

いつ他を好むべきですか?ガイドラインを提案してください。

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

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

回答:


14

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構文です。setenvshには存在せず、cshがスクリプトで使用されることは非常にまれであり、過去20年間(およびさらに長い間zshで)インタラクティブに使用するためにbashを上回っていました。

このenvコマンドは、シバン行を除いて非常にまれにしか役に立ちません。引数なしで呼び出された場合、環境を表示しますが、exportより適切です(ソートされ、値を区切る改行と値の改行を区別するために引用されることがよくあります)。引数で呼び出された場合、それはせずに、余分な環境変数が、同じコマンドを使ってコマンドを実行しますenvまた、(作品VAR=value mycommandの実行をmycommandしてVARまでセットvalueだけのような、env VAR=value mycommand)。その理由は、envシェバング行に便利ですが実行することでPATH、ルックアップ、およびコマンド名で呼び出されたとき、何かをしないために起こります。このenvコマンドは、いくつかの環境変数のみでコマンドを実行するのに役立ちます。-i、またはシェルがインポートしない無効な名前の変数を含む環境を表示するパラメーターなし。


3

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

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

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

setenvちょうどであるexportあなたの答えで述べたように、CSH-家族の殻に。


2
最新のシェルでVAR=asdfは、環境内VARに既にある場合は環境を更新します。(これは、元のボーンシェルには当てはまりませんでした。)
ジル 'SO-悪であるのをやめ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.