bash でシェル変数をエクスポートするにはどうすればいいですか?

bash でシェル変数をエクスポートするにはどうすればいいですか?

私は通常、Linux の bash で作業しており、変数をエクスポートする必要がある場合は次のように記述します。

export LC_ALL=C

しかし、最近は Solaris 関連の作業が増えており、一緒に仕事をしている Solaris 管理者はいつも次のように書いています。

LC_ALL=C ; export LC_ALL

前者よりも後者を好む理由はあるでしょうか?

前者は一部のシェルでは認識されない可能性があると思います。どのシェルですか?

ありがとう。

答え1

真の Bourne シェル (多くの商用 Unix バリアントの /bin/sh) は、単一のステートメントでの割り当てとエクスポートをサポートしていないと思います。これは、私が Solaris を使っていたころの記憶です。

新しい Solaris バージョンがデフォルトで bash を使用するかどうかはわかりません。いずれにしても、後者のケースの方が移植性が高いので、それを使用することをお勧めします。

答え2

Solaris では、/bin/sh には 2 つのステートメントが必要ですが、/bin/bash では 1 つのステートメントで十分です。Linux では、/bin/sh は通常、/bin/bash へのシンボリックリンクであるため、違いはありません。

別のスクリプトによってソースされる可能性のあるスクリプトを作成する場合は、常に 2 つのステートメント形式を使用します。スクリプトがソースされないか、ソースされない場合は、スクリプトの先頭にある shebang 行をチェックして、使用しているシェルを確認します。多くの Solaris スクリプトは /bin/sh を使用し、これは多くのソフトウェア パッケージのデフォルトです。そのため、ほとんどの管理者は、変数をエクスポートするより移植性の高い方法を好みます。

答え3

Solaris 10 以降では、危険な副作用なしに bash をルート シェルとして使用できるため、主に bash で作業している場合は前者を使用できます。マシンをシングル ユーザーに再起動する必要があり、bash が見つからない場合は、Bourne Shell に自動的にフォールバックします。

答え4

私は 1998 年頃の Solaris 2.6 を使用しています。このバージョンには元々 sh と csh しか付属していませんでした。sh を使用すると、env から正しい結果を得るには、おっしゃる 2 行バージョンが必要であることがわかります。sunfreeware.org の bash を使用すると、1 行バージョンで問題なく動作します。

関連情報