特定の例を考えてみましょう。このgrep
コマンドは、GREP_OPTIONS
デフォルトオプションを設定するために呼び出される環境変数を使用します。
今。ファイルtest.txt
に次の行が含まれている場合:
line one
line two
コマンドgrep one test.txt
を実行すると戻ります
line one
オプションを指定してgrepを実行すると、-v
一致しない行が返されるため、出力は
line two
次に、環境変数を使用してオプションを設定しようとします。
なしで設定された環境変数export
は、呼び出しているコマンドの環境に継承されません。
GREP_OPTIONS='-v'
grep one test.txt
結果:
line one
明らかに、オプション-v
はに渡されませんでしたgrep
。
使用したいシェルだけに変数を設定しているとき、たとえばfor i in * ; do
エクスポートしたくないときにこのフォームを使用します$i
。
ただし、変数はその特定のコマンドラインの環境に渡されるため、次のことができます。
GREP_OPTIONS='-v' grep one test.txt
期待値を返します
line two
このフォームを使用して、起動したプログラムのこの特定のインスタンスの環境を一時的に変更します。
変数をエクスポートすると、変数が継承されます。
export GREP_OPTIONS='-v'
grep one test.txt
すぐに戻ります
line two
これは、シェルで後で開始されるプロセスを使用するための変数を設定する最も一般的な方法です
これはすべてbashで行われました。export
bashビルトインです。VAR=whatever
bash構文です。env
、他方では、それ自体がプログラムです。ときenv
に呼び出され、次のことが起こります:
- コマンド
env
は新しいプロセスとして実行されます
env
環境を変更し、
- 引数として提供されたコマンドを呼び出します。
env
プロセスが置き換えられているcommand
プロセス。
例:
env GREP_OPTIONS='-v' grep one test.txt
このコマンドは、(i)envおよび(ii)grepの2つの新しいプロセスを起動します(実際には、2番目のプロセスが最初のプロセスを置き換えます)。grep
プロセスの観点から見ると、結果は実行とまったく同じです。
GREP_OPTIONS='-v' grep one test.txt
ただし、bashの外にいる場合、または別のシェルを起動したくない場合(たとえば、呼び出しexec()
ではなく関数ファミリーを使用している場合)、このイディオムを使用できますsystem()
。
追加の注意事項 #!/usr/bin/env
これはまた、イディオム#!/usr/bin/env interpreter
が使われるよりも使われる理由です#!/usr/bin/interpreter
。シェルのように変数を検索 し、コマンドの実行によってそれ自体を置き換える関数をenv
使用するため、プログラムへのフルパスは必要ありません。したがって、これはインタープリター(perlやpythonなど)がパス上の「座っている」場所を見つけるために使用できます。execvp()
PATH
また、現在のパスを変更することにより、どのpythonバリアントが呼び出されるかに影響を与えることができることを意味します。これにより、次のことが可能になります。
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
Calibreを起動する代わりに、
I am an evil interpreter!
export key=value
構文を拡張し、ポータブルスクリプト(IEで使用すべきではありません#! /bin/sh
)。