web-dev-qa-db-ja.com

Linux環境変数名に使用できる文字

Linux環境変数名に使用できる文字は何ですか?マニュアルページとWebの大まかな検索では、変数の操作方法に関する情報のみが生成されましたが、許可されている名前は生成されませんでした。

com.example.fancypropertyのようなドットを含む定義済みの環境変数を必要とするJavaプログラムがあります。 Windowsではこの変数を設定できますが、Linuxでそれを設定することはできませんでした(SuSEとUbuntuで試しました)。その変数名も許可されていますか?

128

From The Open Group

これらの文字列の形式はname = valueです。 名前には文字「=」を含めることはできません。IEEE Std 1003.1-2001に準拠したシステム間で値を移植可能にするため、値は移植可能な文字セット( NULを除き、以下に示すとおり)。

したがって、名前には=およびNULを除く任意の文字を含めることができますが、次のとおりです。

IEEE Std 1003.1-2001のShell and Utilitiesボリュームのユーティリティで使用される環境変数名は、大文字、数字、および文字の「_」(アンダースコア)のみで構成されますポータブル文字セットで定義され、数字で始まらない。他の文字は実装によって許可される場合があります。アプリケーションは、そのような名前の存在を許容するものとします。

そのため、名前は有効ですが、シェルは文字、数字、アンダースコア以外のものをサポートしていない可能性があります。

186
Robert Gamble

IEEE Std 1003.1-2008/IEEE POSIX P1003.2/ISO 9945.2 Shell and Tools標準のシェルセクションのPOSIX標準では、変数名の字句規則は定義されていませんが、大雑把な look at the source は、次のようなものを使用していることを明らかにします

[a-zA-Z_]+[a-zA-Z0-9_]*

(編集:2番目の文字クラスに不足しているアンダースコアを追加しました。)

いくつかのシェルは正規表現で+をサポートしていないため、よりポータブルな可能性のある正規表現は次のとおりです。

[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}

33
Aiden Bell

私の簡単なテストでは、C変数名が持っているのと基本的に同じルールに従うことを示しました。

  1. a-z、A-Z、_および0-9
  2. 数字で始まってはいけません

したがって、これはそれらの中の.を除外します。不正な変数名は、unknown commandでクレジットされます。

これは、ほとんどがBASH互換のZSHでテストされました。

11
LukeN

シェルに依存します。デフォルトではbashを使用していると思われます。この場合、文字、数字、アンダースコアは使用できますが、変数名を数字で始めることはできません。 Bash v.3の時点では、 変数名にピリオドは使用できません

5
ire_and_curses

「許可」の意味によって異なります。

一回限りのWindowsを無視する:

環境は、プログラムのメイン関数に渡される文字列の配列です。 execve(2)を読むと、これらの文字列に関する要件や制限はnull終了以外に表示されません。

慣例により、各文字列はNAME = valueで構成されます。引用規則はないため、この規則では名前に「=」を含めることはできません。

通常の人間は、これらの文字列をシェルと話し合って設定します。各シェルには、有効な変数NAMEの独自のアイデアがあるため、シェルオブザモーメントのマニュアルページを読んで、その考えを確認する必要があります。

一般に、com.baseball.spit = fleaghのようなものはJavaシステムプロパティであり、一部のJavaプログラムが環境にフォールバックする意思があるかどうか、 -Dで指定することをお勧めします。

4
bmargulies