私はピックアップしました-おそらく1990年代半ばにUsenetで(!)-その構成が
export var=value
バシズムであり、移植可能な表現は
var=value
export var
私は何年もこれを提唱してきましたが、最近、誰かが私にそれについて異議を唱えました、そして、私がかつて私の確固たる信念であったものをバックアップするためのドキュメントを本当に見つけることができません。
"export: command not found"
のグーグルは、誰かが実際にこの問題を抱えていたというケースを引き起こさないようですので、それが本物であったとしても、それはあまり一般的ではないと思います。
(私が得たヒットは、句読点をコピー/貼り付けて 'export: command not found
などで終わったか、export
をSudo
;および初心者csh
ユーザーがBourne Shell構文を使用しようとしている。)
OS X、およびsh
がdash
であるものを含むさまざまな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"に移植できない場合、それはトリビアに過ぎません。シェルがこの構文に実際に対応できない運用システムがある場合、それは知っておくと役に立ちます。
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'
その他(bash
、ksh
)。
ながら
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)。
これはバシズムではなく、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ディストリビューション用にコンパイルできます。