エクスポートコマンドはshとbashで異なる動作をしますか?

エクスポートコマンドはshとbashで異なる動作をしますか?

最初の行でコマンドの解釈に使用されるシェルの種類を指定しないシェルスクリプトがあります。

この.shファイルは、RHEL 7などの最新のシステムに移行するまで、SCO Unix 5システムで使用されました。

SCO Unixではshがデフォルトシェルであり、Red Hat Linuxではbashがデフォルトシェルであるようで、スクリプトをLinuxに移植して実行させれば基本的にbash解析を使うことになると思いました。

家に近いこのスクリプトには次の部分があります。

MY_SETUP=1
echo $MY_SETUP
MY_SETUP=2 export MYSETUP
echo $MY_SETUP

ご覧のとおり、エクスポートコマンドの後の変数名は、割り当ての変数名ではありません(タイプミスです)。

スクリプトがshまたはbashとして解釈されると、このセクションの後のMY_SETUP変数の値が異なることがわかりました。

  • sh MY_SETUP 値 = 2

  • バッシュMY_SETUP値= 1

bashはエクスポートコマンドでインライン割り当てを完全に無視し、古い値を保持するようです。

これらの実行はすべてエラーを返すわけではないので、動作が異なる理由が何であるか疑問に思います。誰かが私にこれを説明できますか?

編集する:

Stéphane Chazelasの答えによると、bashではこのコマンドが

var=x export var

「x」の値を設定せずにエクスポートすることはありませんが、私の環境では両方を行います。混乱しています。

ベストアンサー1

bash歴史的なBourne Shellとの偏差でもあるPOSIX偏差を検出したようです。これをバグと呼ぶことも、単に動作の偏差と呼ぶこともあります。

引用したスクリプトが印刷されます。

1
2

デフォルトの動作では、bashを除くすべてのシェルで使用されます。

と呼べばbash --posixいいです。

ユーザー Kusalananda のポインタによると、基本的に bash は非特殊な組み込み機能だけでなく、終了時にすべての組み込み機能が一時環境を復元するようにするように見えます。exportPOSIXは特別に組み込まれているため、環境値を維持するためにシェルは1980年代初頭のBourne Shellのように動作する必要があります。

Bashはデフォルトではこれを実装していないため、偏見が発生します。

おすすめ記事