
私は通常、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 行バージョンで問題なく動作します。