ドット(。)を含む変数をエクスポートする


39

ドットを含む変数をエクスポートする方法。試したときに「無効な変数名」が表示されます:

 export my.home=/tmp/someDir
-ksh: my.home=/tmp/someDir: invalid variable name

メタキャラクターのドット(。)をエスケープしても助けにはなりませんでした

$ export my\.home=/tmp/someDir
export: my.home=/tmp/someDir: is not an identifier


1
残念ながら、同様の質問を入力/検索したときにリストされませんでした。ごめんなさい。..
user1587504

回答:


50

少なくともbashmanページでは、エクスポート構文を次のように定義しています。

export [-fn] [name[=word]] ...

また、「名前」を次のように定義します。

   name   A  word  consisting  only  of alphanumeric characters and under
          scores, and beginning with an alphabetic character or an  under
          score.  Also referred to as an identifier.

したがってmy.home、有効な識別子ではないような変数を実際に定義することはできません。

あなたのkshは識別子の定義が非常に似ているため、この種の変数も許可されていないと確信しています。(マニュアルページをご覧ください。)

また、識別子(および変数名)として許可されるものを指定する一般的な標準(POSIX?)があることも確信しています。


何らかの理由でこの種の変数が本当に必要な場合は、次のようなものを使用できます

env "my.home=/tmp/someDir" bash

とにかくそれを定義します。ただし、この場合も、通常のシェル構文を使用してアクセスすることはできません。この場合、おそらくperlのような別の言語が必要です。

perl -e 'print $ENV{"my.home"}'

例えば

env "my.home=/tmp/someDir" perl -le 'print $ENV{"my.home"}'

パスを印刷する必要があります。


antの統合が原因です。そして残念ながら、unixから変数を設定/エクスポートすることはできません。あなたの答えを受け入れます。..
user1587504

1
antは通常、ANT_OPTSまたは〜/ .antrc と呼ばれる単一の環境変数によって構成されます。ant自体に奇妙な環境変数名は必要ありません。
ミカ

8

環境変数には等号またはヌルバイトを含まない任意の名前(空の文字列を含む)を付けることができますが、シェルは環境変数をシェル変数にマップし、ほとんどのシェルでは、変数名はASCII英数字に制限され_、最初の文字はtは数字である(位置パラメータなどの他の特殊なものを除いて$*$-$@、...、(対応する環境変数にマッピングされていません))。また、一部の変数はシェルによって/に予約/特殊化されていることに注意してください。

その例外:

  • rcシェルなどその誘導体esakanga空の文字列以外の任意の名前をサポートし、すべての数字であるか、含まれているもの=の文字(および、常に環境にすべての変数をエクスポート、などの特殊変数の用心*statuspid...):

    ; '%$£"' = test
    ; echo $'%$£"'
    test
    ; '' = x
    zero-length variable name
    ;

    ただし、名前にalnumが含まれていない変数または実行されるコマンドの環境で渡される配列の場合は、独自のエンコードを使用します。

    $ rc -c '+ = zzz; __ = zzz; a = (zzz xxx); env' | sed -n /zzz/l
    __2b=zzz$
    __5f_=zzz$
    a=zzz\001xxx$
    $ env +=x rc -c "echo $'+'"
    x
    $ env __2b=x rc -c "echo $'+'"
    x
  • AT&T kshyashおよびzsh(もbashなく、シングルバイト文字だけのための)現在のロケールでサポートalnums、ASCIIのものではないだけ。

    $ Stéphane=1
    $ echo "$Stéphane"
    1

    これらのシェルでは、ほとんどの文字をアルファと見なすようにロケールを変更できますが、それでものようなASCII文字では機能しません.。あなたはだますことができるzshか、kshという考えに£手紙ではなく、という.か、他のASCII文字(変数名にできるように文字が懸念している、いないため[[:alpha:]]、インスタンスのためのグロブ)。

  • ksh93には、などのドットを含む名前の特殊変数があります${.sh.version}が、それらは環境変数にマップされておらず、特別です。これ.は、他の変数と競合しないようにするためです。それはそれを呼び出すために選択した場合$sh_version、それはすでにその変数を使用し、潜在的に壊れたスクリプトを持つことができます(どのようにインスタンスを参照zshのに問題がある$pathか、$commands特殊な配列/ハッシュ変数(ラCSH)ブレークは、いくつかのスクリプトのことを)。

これらの変数をサポートしていない殻に加えて、やるmksh pdkshのようないくつかのシェルが/ことに注意してください削除、彼らが受ける環境からは(bash、空の名前を持つものを取り除きashkshそしてbash含まないそれらの環境文字列削除=文字を):

$ env %%%=test 1=%%% a.b=%%% mksh -c env | grep %%%
$ env %%%=test 1=%%% a.b=%%% bash -c env | grep %%%
%%%=test
a.b=%%%
1=%%%

$ perl -le '$ENV{""}="%%%"; exec "bash", "-c", "env"' | grep %%%
$ perl -le '$ENV{""}="%%%"; exec "zsh", "-c", "env"' | grep %%%
=%%%

$ echo 'main(){char*a[]={"sh","-c","env",0};char*e[]={"%%%",0};
    execve("/bin/ash",a,e);}'|tcc -run - | grep %%%
$ echo 'main(){char*a[]={"sh","-c","env",0};char*e[]={"%%%",0};
    execve("/bin/zsh",a,e);}'|tcc -run - | grep %%%
%%%

要約すると、最高のは、ほとんどのシェルでサポートされている変数名に固執しても、シェル(のように特別なものを避け、環境変数(と小文字またはエクスポートないシェル変数の混在の場合)のために大文字を使用しようとすることですIFSPS1BASH_VERSION...)。

それらをサポートしていないが破棄しないシェルでそのような変数を設定する必要がある場合は、次のような方法で自分で再実行できます。

#! /bin/ksh -
perl -e 'exit 1 unless defined($ENV{"a.b"})' || exec env a.b=%%% "$0" "$@"

(明らかに、スクリプトの途中でそれを行う必要がある場合、それは助けにはなりませんが、再実行でシェル実行環境を保存および復元するためのアプローチを見ることができます)。または、デバッガーのアプローチを試してください。

gdb --batch-silent -ex 'call putenv("a.b=%%%")' --pid="$$"

(1はで動作するように思われることzshyashcshtcshのLinux AMD64上ではなく、私が試した他のシェル(のいずれかとmkshksh93bashdash))。


1
mksh(そしてpdksh)実際に、現在のシェル実行環境でエクスポートされたパラメーターのみを使用して、生成された環境プロセスを完全にゼロから構築します。したがって、それらの変数をそれらのシェルに渡す方法はありません。(渡される変数変更される可能性があることに注意してください。たとえばmksh、いつかアレイのエクスポートをサポートする予定です。)
mirabilos

0

他の投稿が指摘しているように、最も一般的なシェルでは、名前にピリオドを使用して環境変数を設定することはできません。ただし、特にDockerと呼び出されたプログラムに関連する状況を発見しました。この場合、ソフトウェアはピリオド付きのキー値を必要としました。

ただし、これらの各状況では、これらのキーと値のペアは、環境変数以外の手段を介してプログラムに渡すことができます。たとえば、Antでは、「-propertyfile(filename)」を使用して、プロパティファイルにフォーマットされたキーと値のコレクションを渡すことができます。Confdは「-backend file -file(yaml file)」を許可します。

「C__any_value = 'my.property.key = the value'」の形式で環境変数を渡しました。次に、プログラムの呼び出しを切り替えて、最初にファイルを生成しました。

set | awk -- 'BEGIN { FS="'\''" } /^C__/ {print $2}' > my-key-values.txt

setBorne Shell のコマンドは、各プロパティをフォームの別々の行に出力します

C__any_value='my.property.key=the value'

このawkコマンドはC__、で始まる環境変数のみを処理し、単一引用符に含まれる値を抽出します。

この方法では、処理プログラムが必要とする正確な形式で環境変数値を設定する必要があります。さらに、プロパティ値またはキーに一重引用符が含まれる場合、awkフィールド区切り文字を、表示されないことがわかっている何かに変更し、値をその文字で囲む必要があります。たとえば%、セパレータとして使用するには:

$ C__1="%my.key=the'value%"
$ set | awk -- 'BEGIN { FS="%" } /^C__/ {print $2}'
my.key=the'"'"'value

(正確な出力はシェルによって異なります。)引用符のエスケープをデコードするには、追加の手順を実行する必要があります。

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