[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:73997] Re: ハードディスク増設について


 Necoです。

In Message-Id <20000925.173203.78776649.tshiozak _at_ astec.co.jp> 
        "T.SHIOZAKI" <tshiozak _at_ astec.co.jp> さんwrites:
> 塩崎です。

> > LANG=C じゃなくて LC_ALL=C かもしれないです。
> >  ( LC_ALL=C; /sbin/cfdisk )
> > と、やってみたら?
> > 戻すの面倒だから、不精者の私は export はしない。
> 
> 問題の本質とは関係ないですが、単に一時的に環境変数を設定したいだけなら、

 いや、ここは問題の本質に関わるのでツッコミ入れて貰わないと。
そもそもこの手の話は shell 依存なんで shell を特定しないと話
が進みません。
 ここでは shell は bourne shell 系に限定して話を進めますね。
csh 系ではこの辺りの話は無効です。とゆーか csh では出来ない
機能が多いんでパス。


> LC_ALL=C /sbin/cfdisk
> 
> でできます :-)

 これと先の「( LC_ALL=C; /sbin/cfdisk )」とは全く異なる挙動
を示します。塩崎さんの書き方じゃないと cfdisk に locale 値は
伝わりません。
 実際にこの例でうまくいっている環境もあると思いますが、それ
は shell が login shell として起動された際に予め LC_ALL が環
境変数として定義されていただけの話です。一般にはこのことは保
証されません。
 戻すのが面倒だかどうだか知りませんが、shell 変数と環境変数
の違いを正しく認識しておかないと思わぬところで失敗すると思い
ますので、気をつけて下さいね。

 基本的には「VAR=val」という形式のコマンドでは shell 変数の
内容が変更されます。これはその shell に local な変数で、その
shell から起動した子 process には伝わりません。
 shell 変数を環境変数にするコマンドが「export」で、環境変数
は子 process に伝わりますから「VAR=val; export VAR」とすれば
以降起動した子 process はこの値を参照出来ます。
 一旦環境変数化した shell 変数は unset するまで環境変数であ
り続けるので、「export VAR; VAR=val」という順序でも構いませ
んし、二回目からは「VAR=val」だけでも構いません。
 bash の場合はこの 2 コマンドを短縮して「export VAR=val」と
いう形式で実行することも出来ます。


 これに対し、「VAR=val command」という書き方があります。こ
れは良く似ていますが shell 変数への代入とは異なり、一時的に
環境変数に代入することを表しています。
 export の場合はその後も unset しない限りずっとその環境変数
が有効なのに対し、「VAR=val command」形式ではここで起動した
「command」という子 process にのみこの環境変数が有効となりま
す。
 この形式ですと、「command」以外の子 process はおろか、shell
自身にすらこの「VAR」の値は参照出来ませんので、後でわざわざ
元に戻したり sub shell 化したりする必要がありません。
 局所的に環境変数を用いたいときの常套手段ですね。例えば日本
語環境の中で man page の原文に当たりたい時は「LANG=C man man」
などとします。


 ここからは余談になりますが、bourne shell 系の shell には環
境変数に絡んだ shell option が二つ用意されています。-a と -k
です。
 それぞれ、起動時に「sh -a」のように option 引数として指定
するか、もしくは起動後に「set -a」のように set コマンドを用
います。元に戻すのは「set +a」。
 -a option を有効にすると、以降定義された全ての shell 変数
は同時に環境変数にもなります。-a option が有効になる前のもの
については依然 shell 変数のままです。
 -k option を有効にすると、「VAR=val command」形式の代入文
を command line の任意の位置に記述出来るようになります。この
時には例えば「man LANG=C man」といった記述も可能です。

 面倒臭がり屋の人にはこういった option が打って付けかも知れ
ませんね。

                                       白井 隆 (as Neco)


この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
Follow-Ups: References: