「var=value エクスポート」が機能しない場所はどこですか?

「var=value エクスポート」が機能しない場所はどこですか?

私はおそらく1990年代半ば(!)にこの構造を見つけました。

export var=value

Bashismで、ポータブル表現は次のとおりです。

var=value
export var

私は長年これを擁護してきましたが、最近誰かが私に挑戦し、文字通りかつて私の強い信仰を裏付ける文書を見つけることができませんでした。

Google検索"export: command not found"誰かが実際にこの問題を経験した事例はないようですので、それが実際といってもあまり一般的ではないと思います。

(私が受け取ったクリックは、初心者が句読点をコピー/貼り付けたために発生したようです。'export: command not foundまたは、類似またはBourneシェル構文を使用したい初心者ユーザーとexport一緒に使用しようとしています。 )sudocsh

OS Xshdash

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"に移植されていない場合、それはただの不思議なことに過ぎません。これは、本番システムでシェルが実際にこの構文を処理できないことを確認するのに役立ちます。

答え1

bashismではなく、POSIX互換の構文です。これは実際にずっと前にkshismで始まり、その後Bourne構文に基づいてほぼすべてのシェルで採用されました。唯一の悪名高い例外は、/bin/sh以前のBourneシェル構文に固執するSolaris 10以前のバージョンです。 Solaris 11はPOSIX互換シェルを/bin/sh

ちなみに、exportBourneシェルの以前のバージョンにはすでに組み込みコマンドがあるので、インターネット検索は誤解を招く可能性がexport: command not foundあります。

export以下は、割り当てとともに使用した場合のレガシーBourneシェルの動作です。

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

香水を呼び起こす人のために、オリジナルBourneシェルのソースコードほとんどのUnixとLinuxのディストリビューションで利用可能でコンパイルされています。

答え2

export foo=bar

Bourneシェル(ash / bash / ksh / yash / zshなどの最新の実装が派生した1970年代の古いシェル)ではサポートされていませんsh。これはによって紹介されますksh

Bourne シェルでは、次のことができます。

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単独で引用されている場合、または一部の拡張(一部の拡張でも)の結果である場合は、シェルによって特別な扱いが受けられません。

バラよりローカル変数の割り当てには引用符が必要ですか?もっと学ぶ。

Bourneの構文は次のとおりです。

d=$a; export d

解釈はあいまいさなしですべてのシェルに対して同じです(d=$a export dBourneシェルとPOSIX互換シェルにも適用されますが、エミュレーションをzsh除いて最新バージョンには適用されませんsh)。

状況がさらに悪化する可能性があります。たとえば、参照してください。最近の議論bash配列の場合。

(IMO、これを紹介するのは間違いでした。特徴)。

関連情報