- ベストアンサー
シェルの環境変数に関する超初歩的な質問
- シェルの環境変数についての超初歩的な質問です。
- 実際にやってみたところ、例文が間違っている結果になったため、疑問を持ちました。
- サブシェルが起動する条件について疑問があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
質問1 例文が間違っています。 HOME=/New echo "My Home is $HOME" は、時系列で書くと、 1.$HOMEの展開・・・・・この時点では /Old 2.HOMEに一時的に /New をバインド 3.echo の実行 なので、/Old が表示されます。 /New と表示させるためには、$HOMEの展開を2以降に遅らせる必要があります。 例1: HOME=/New eval echo 'My Home is $HOME' 例2: HOME=/New sh -c 'echo "My Home is $HOME"' 質問2 サブシェルはいずれのケースでも起動されません。 変数代入をコマンドに前置すると、コマンド起動時に「起動されるコマンドの環境変数」を書き換えてから起動します。シェルの環境変数は不変です。 代入だけだと、環境変数またはシェル変数の変更という意味になります。コマンド起動とは全く違った構文です。 サブシェルが起動するのは、 1. ( ) で囲んだ場合 2. パイプをつないだ場合 3. コマンド置換の場合 です。
その他の回答 (4)
回答の前に1行目が気になる。$home じゃなくて、正しくは $HOME だろうとして回答する。それと、シェルにもいろいろあるが、たぶん bash だろうとする。 「変数の代入 コマンド」と書いた場合、環境変数の値はコマンドを実行する間だけ一時的に変更されるが、コマンドの終了後は元に戻る。 簡単な実験をしてみよう。HOME の値が変更されると面倒なので、ここではテスト用に FOO という環境変数を使います。 $ printenv | grep FOO FOO=/Old # 今の値は /Old $ FOO=/New printenv | grep FOO FOO=/New # 一時的に値が /New に変更されてる $ printenv | grep FOO FOO=/Old # 元の /Old に戻った 質問のコマンドラインだと、「『echo "My Home is $HOME"』を実行する間だけ HOME の値を /New にしてね」 という意味になります。
お礼
ありがとうござます。インタープリタに2段階手順を踏ませれば、一時的にNEWの値のままで行けるのですね。
- h271015
- ベストアンサー率71% (62/87)
No2です。 申し訳ありません。No2で回答した内容ですが、誤ってました。無視してください。
お礼
ありがとうございます。
- h271015
- ベストアンサー率71% (62/87)
元の例文がどうなっているのか分かりませんが、以下を実行されたということですよね? 1. まず以下を実行 echo $HOME => /Old (今の$HOMEの内容) 2. 次に以下を実行 HOME=/New echo "My Home is $HOME" => My Home is /Old (<=新しいディレクトリ名になってほしいが、古いまま) 3. 最後に以下を実行 echo $HOME => /Old (<=やはり古いまま) $HOMEは環境変数なので、これを変更したい場合は 2. で以下のようにする必要があります。 export $HOME=xxxx (HOMEと$HOMEは別です)
- hoge1229
- ベストアンサー率29% (58/194)
HOME=/New; echo "My Home is $HOME" シェルの区切りは空白じゃなくてセミコロンか改行ですよ。
お礼
ありがとうございます。と言うことは、3行目の HOME=/New は、文法間違いという理由で、/Newが代入されなかったという理解で良いのですか?例文がおかしかっただけなのでしょうか。
お礼
ありがとうございます。シェルコマンドインタープリターの解釈の順番というものが掴めました。