ENV(1) | FreeBSD General Commands Manual | ENV(1) |
名称
env — 環境変数を設定してコマンドを実行するか、または環境変数を印刷 (表示) する書式
env | [ -iv][ -P altpath][ -S string][ -u name][ name= value ...][ utility [ argument ...]] |
解説
env ユーティリティは、コマンド行で指定された環境変数の値を変更してから、別の utility (ユーティリティ) を実行します。各 name= value オプションは環境変数 name を value 値に設定することを指定します。そのような環境変数は、 utility が実行される前に設定されます。オプションは次の通りです:
- -i
- name= value オプションによって指定される、それらの環境変数のみとともに utility を実行します。 env は完全に無視されます。
- -P altpath
- PATH 環境変数の値を使用する代わりに、指定された utility プログラムの位置を見つけるのに、 altpath によって指定される一連のディレクトリを検索します。
- -S string
- 与えられた string (文字列) を複数の文字列に分解し、 env ユーティリティへの別々の引数として結果のそれぞれの文字列を処理します。 -S オプションは、以下で説明されるように、いくつかの特殊文字エスケープシーケンスを認識して、環境変数の置き換えをサポートします。
- -u name
-
環境変数
name が、環境 (environment) にあるなら、残っているオプションを処理する前に、それを削除します。これは、
sh(1) の
unset コマンドと同様です。
name のための値は、‘
=
’文字を含んではいけません。 - -v
- env ユーティリティによって行われた処理の各段階について、冗長な情報を印刷 (表示) します。 -v が複数の回指定されるなら、追加情報が印刷 (表示) されます。
上記のオプションは、それらが name= value オプションの前に指定されるときだけ認識されます。
utility が指定されないなら、 env は 1 行毎に 1 つの name/value の組で、環境変数の名前 (name) と値 (value) を印刷 (表示) します、
-S -Ss -(文字列分割) -処理の詳細
-S オプション処理は与えられた string を、 string で見つけられた任意の空白と <タブ>文字に基づいて別々の引数に分割します。それらの新しいそれぞれの引数は、元の env コマンドで別々の引数として指定されたかのように取り扱われます。 空白とタブは、シングルクォート (“ '
”) か、ダブルクォート (‘ "
’) か、またはバックスラッシュ (‘ \
’) を使用してそれらの新しい引数の 1 つに埋め込むことができます。シングルクォートは、次に一致するシングルクォートまでの、シングルクォート以外の文字をエスケープします。ダブルクォートは、次に一致するダブルクォートまでの、ダブルクォート以外の文字をエスケープします。一致するクォート文字の前に string の終りに到達するなら、エラーです。
-S が‘ #
’文字で始まる新しい引数を作成するなら、その引数と string の残りは無視されます。‘ \#
’シーケンスは、新しい引数を‘ #
’文字で始めたいとき、 string の残りがスキップされずに、使用することができます、
string 値を処理している間に、 -S 処理は何らかの動作を取るために表されるエスケープシーケンスとして特定の文字の組み合わせを取り扱います。文字エスケープシーケンスはバックスラッシュ表記法です。文字とそれらの意味は次の通りです:
- \c
- string に残っている文字を無視します。これはダブルクォート文字列の中に現れてはいけません。
- \f
- フォームフィード <form-feed>文字に置き換えます。
- \n
- 復帰改行 <new-line>文字に置き換えます。
- \r
- 復帰 <carriage return>文字に置き換えます。
- \t
- タブ文字に置き換えます。
- \v
- 垂直タブ文字に置き換えます。
- \#
-
‘
#
’文字に置き換えます。与えられた string を分割することによって作成された引数の 1 つの最初の文字として‘#
’が必要であるときに役に立ちます。 - \$
-
‘
$
’文字に置き換えます。 - \_
- ダブルクォート文字列の中にこれが見つけられるなら、単一の空白に置き換えます。クォート文字列の外でこれが見つけられるなら、元の string の新しい引数の間の分離文字として取り扱われます。
- \"
- ダブルクォート文字に文字に置き換えます。
- \´
- シングルクォート文字に置き換えます。
- \\
- バックスラッシュ文字に置き換えます。
シングルクォート文字列の中で認識される唯一のシーケンスは、シングルクォートとバックスラッシュのためのシーケンスです。他のシーケンスはシングルクォート文字列の中では、特別な意味はありません。ダブルクォート文字列の中では、すべてのエスケープシーケンスが認識されます。単一の‘ \
’文字が上記にリストされたもの以外の文字に続くなら、エラーです。
また、 -S の処理は環境変数の値の置き換えをサポートします。これを行うためには、環境変数の名前は、次のように‘ ${}
’の内側になければなりません: ${SOMEVAR}
。 $SOMEVAR
のような一般的なシェルの構文はサポートされていません。置き換えられたすべての値は、それらが、元の env ユーティリティが呼び出されたときの環境変数の値になります。それらの値は、上記に説明されるようなエスケープシーケンスのチェックは行われません。また、 name= value の任意の設定は、 -S 処理における置き換えのために使用される値に影響しません。
また、 -S 処理は、ほとんどのシェルによって定義されている特殊パラメータの値を参照することができません。例えば、 -S は次のような特殊パラメータを認識することができません: 与えられた string の内側に現れるなら、‘ $*
’, ‘ $@
’, ‘ $#
’, ‘ $?
’または‘ $$
’。
シェルスクリプトでの使用
env ユーティリティは、 execve(2) で説明されるように、解釈されるスクリプトの最初の行で、 interpreter (インタプリタ) としてしばしば使用されます。 解釈されるスクリプトの (最初の行の) ‘ #!
’をカーネルが解析する方法は、 FreeBSD 6.0 で変更されたことに注意してください。それ以前の、 FreeBSD カーネルは、最初の行を行内で見つかる空白類 (空白または <タブ>文字) を基に別々の引数に分割します。したがって、 /usr/local/bin/someport と名前が付けられたスクリプトの最初の行が、次の場合:
#!/usr/local/bin/php -n -q -dsafe_mode=0
/usr/local/bin/php プログラムは、次の引数で起動されるでしょう:
arg[0] = '/usr/local/bin/php' arg[1] = '-n' arg[2] = '-q' arg[3] = '-dsafe_mode=0' arg[4] = '/usr/local/bin/someport'
これに、 someport を実行するとき、ユーザが指定した任意の引数が追加されます。しかしながら、この‘ #!
’行での複数のオプションの処理は、いかなる他のオペレーティングシステムでも解釈されるスクリプトの最初の行を解析する方法として行われていません。したがって、 FreeBSD 6.0 リリースのために行われた変更の後では、そのスクリプトは、次の引数で /usr/local/bin/php を開始するようになります:
arg[0] = '/usr/local/bin/php' arg[1] = '-n -q -dsafe_mode=0' arg[2] = '/usr/local/bin/someport'
これにユーザが指定した任意の引数が追加されます。これはいくつかのスクリプトの振る舞いで著しい変化をもたらします。上記のスクリプトの場合では、 FreeBSD 6.0 の下で以前のリリースと同じような振る舞いを行うためには、最初の行を次のように変更するべきです:
#!/usr/bin/env -S /usr/local/bin/php -n -q -dsafe_mode=0
env ユーティリティはただ一つの引数として全体の行で開始されます:
arg[1] = '-S /usr/local/bin/php -n -q -dsafe_mode=0'
そして、 /usr/local/bin/php. を実行する前に、 -S 処理はその行を別々の引数に分割します。
環境変数
env ユーティリティは、名前に‘/
’文字が含まれず、
-P オプションが指定されていないなら、要求された
utility の場所を見つけるために
PATH 環境変数を使用します。
終了ステータス
The env utility exits 0 on success, and >0 if an error occurs. 終了ステータス 126 は、 utility は見つけられましたが、実行することができなかったことを示します。終了ステータス 127 は、 utility を見つけることができなかったことを示します。使用例
env ユーティリティが解釈されるスクリプトの最初の行の一部としてしばしば使用されるので、次の例は、 env ユーティリティがスクリプトで役に立つことができる多くの方法を示します。解釈されるスクリプトのカーネルでの処理は、それ自体のインタプリタとして直接ある他のスクリプトを参照するスクリプトを許していません。これを回避する方法として、
#!/usr/local/bin/foo
と
#!/usr/bin/env /usr/local/bin/foo
の主な違いは、後者が /usr/local/bin/foo がそれ自体で解釈されるスクリプトであっても動作することです。
たぶん env の最も一般的な使用法は、インタプリタが異なったシステム上で異なったディレクトリにあるかもしれないとき、スクリプトに対して正しいインタプリタを見つけることです。次の例は、 PATH によって指定された (複数の) ディレクトリを検索することによって‘ perl
’インタプリタを見つけます。
#!/usr/bin/env perl
その例の 1 つの制限は、 PATH のためのユーザの値が実行したいインタプリタを見つける値に設定されていると仮定することです。特定のディレクトリのリストが utility を検索するため使用されるのを確認するために -P オプションを使用することができます。また -S オプションは、この例が正しく動作するために必要であることに注意してください。
#!/usr/bin/env -S -P/usr/local/bin:/usr/bin perl
上記は、 /usr/local/bin または /usr/bin にある場合のみ、‘ perl
’を見つけます。より多くの柔軟性を提供するために PATH の現在の値と組み合わせることもできるでしょう。 -S と -P オプションの間に空白が必要でないことに注意してください:
#!/usr/bin/env -S-P/usr/local/bin:/usr/bin:${PATH} perl
互換性
env ユーティリティは、 -i の同義語として - オプションを受け付けます。規格
env ユーティリティは、 IEEE Std 1003.1-2001 (“POSIX.1”) に適合しています。 -P, -S, -u と -v オプションは、 FreeBSD によってサポートされている標準でない拡張ですが、他のオペレーティングシステムで利用可能でないかもしれません。歴史
env コマンドは、 4.4BSD で登場しました。 -P, -S と -v オプションは、 FreeBSD 6.0 で追加されました。バグ
env ユーティリティは、明白な理由で、それらの名前に等号 (‘=
’) がある
utility の値を取り扱いません。
いくつかのロケールで不正確な結果をもたらすかもしれない -S オプションを処理するとき、 env ユーティリティは、マルチバイト文字を考慮に入れません。
April 17, 2008 | FreeBSD |