web-dev-qa-db-ja.com

「export var = value」はどこで利用できませんか?

私はピックアップしました-おそらく1990年代半ばにUsenetで(!)-その構成が

export var=value

バシズムであり、移植可能な表現は

var=value
export var

私は何年もこれを提唱してきましたが、最近、誰かが私にそれについて異議を唱えました、そして、私がかつて私の確固たる信念であったものをバックアップするためのドキュメントを本当に見つけることができません。

"export: command not found" のグーグルは、誰かが実際にこの問題を抱えていたというケースを引き起こさないようですので、それが本物であったとしても、それはあまり一般的ではないと思います。

(私が得たヒットは、句読点をコピー/貼り付けて 'export: command not found などで終わったか、exportSudo;および初心者cshユーザーがBourne Shell構文を使用しようとしている。)

OS X、およびshdashであるものを含むさまざまなLinuxディストリビューションで動作することは確かです。

sh$ export var=value
sh$ echo "$var"
value
sh$ sh -c 'echo "$var"'  # see that it really is exported
value

今日の世界では、export var=valueは安全に使用できますか?

結果がどうなるかを理解したいと思います。 v7 "Bourne classic"に移植できない場合、それはトリビアに過ぎません。シェルがこの構文に実際に対応できない運用システムがある場合、それは知っておくと役に立ちます。

32
tripleee
export foo=bar

bourneシェル(ash/bash/ksh/yash/zshのような最新のsh実装の派生元である70年代の古いシェル)ではサポートされていませんでした。これはkshによって導入されました。

ボーンシェルでは、次のようにします。

foo=bar export foo

または:

foo=bar; export foo

またはset -k

export foo foo=bar

今、の動作:

export foo=bar

シェルによって異なります。

問題は、割り当てと単純なコマンド引数の解析と解釈が異なることです。

foo=bar上記は、一部のシェルではコマンド引数として解釈され、他のシェルでは割り当てとして解釈される場合があります(時々)。

例えば、

a='b c'
export d=$a

として解釈されます:

'export' 'd=b' 'c'

いくつかのシェル(ash、古いバージョンのzsh(shエミュレーション)、yash)および

'export' 'd=b c'

その他(bashksh)。

ながら

export \d=$a

または

var=d
export $var=$a

すべてのシェルで同じように解釈されます('export' 'd=b' 'c')このバックスラッシュまたはドル記号は、これらの引数を割り当てと見なすことをサポートするシェルを停止するためです。

シェルによっては、export自体が引用されている場合、または一部でも展開されている場合でも、特別な扱いを受けられなくなります。

詳細については、「 ローカル変数の割り当てには引用符が必要ですか? 」を参照してください。

ただし、ボーン構文:

d=$a; export d

曖昧さのないすべてのシェルで同じように解釈されます(d=$a export dは、BourneシェルおよびPOSIX準拠のシェルでも機能しますが、zshエミュレーションでない限り、shの最近のバージョンでは機能しません。

それよりもさらに悪化する可能性があります。たとえば、配列が関係する場合は、 その最近のbashに関する説明 を参照してください。

(IMO、それを導入するのは間違いでしたfeature)。

21

これはバシズムではなく、POSIX準拠の構文です。それは実際にはかなり前にkshismとして始まり、後にほとんどすべてのBourne構文ベースのシェルによって採用されました。唯一の悪名高い例外は、Solaris 10以前の/bin/shで、これはレガシーのBourne Shell構文に準拠しています。うまくいけば、Solaris 11はPOSIX準拠のシェルを/bin/shとして使用します。

ちなみに、exportはレガシーBourne Shellの組み込みコマンドなので、export: command not foundのグーグルは誤解を招くものでした。

exportを影響と組み合わせた場合のレガシーBourne Shellの動作は次のとおりです。

$ export var=22
var=22: is not an identifier

懐かしさのために、 こののソースコード 元の Bourne Shell が利用可能で、ほとんどのUnixおよびLinuxディストリビューション用にコンパイルできます。

29
jlliagre