私はおそらく1990年代半ば(!)にこの構造を見つけました。
export var=value
Bashismで、ポータブル表現は次のとおりです。
var=value
export var
私は長年これを擁護してきましたが、最近誰かが私に挑戦し、文字通りかつて私の強い信仰を裏付ける文書を見つけることができませんでした。
Google検索"export: command not found"
誰かが実際にこの問題を経験した事例はないようですので、それが実際といってもあまり一般的ではないと思います。
(私が受け取ったクリックは、初心者が句読点をコピー/貼り付けたために発生したようです。'export: command not found
または、類似またはBourneシェル構文を使用したい初心者ユーザーとexport
一緒に使用しようとしています。 )sudo
csh
OS Xsh
とdash
。
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
。
ちなみに、export
Bourneシェルの以前のバージョンにはすでに組み込みコマンドがあるので、インターネット検索は誤解を招く可能性が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'
その他(bash
、ksh
)。
しかし、
export \d=$a
または
var=d
export $var=$a
'export' 'd=b' 'c'
バックスラッシュやドル記号は、それをサポートするシェルがこれらの引数を代入として扱うのを防ぐため、すべてのシェル(たとえば)で同じように解釈されます。
export
単独で引用されている場合、または一部の拡張(一部の拡張でも)の結果である場合は、シェルによって特別な扱いが受けられません。
バラよりローカル変数の割り当てには引用符が必要ですか?もっと学ぶ。
Bourneの構文は次のとおりです。
d=$a; export d
解釈はあいまいさなしですべてのシェルに対して同じです(d=$a export d
BourneシェルとPOSIX互換シェルにも適用されますが、エミュレーションをzsh
除いて最新バージョンには適用されませんsh
)。
状況がさらに悪化する可能性があります。たとえば、参照してください。最近の議論bash
配列の場合。
(IMO、これを紹介するのは間違いでした。特徴)。