• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:超初歩的質問で恐縮ですが、シェルの環境変数)

シェルの環境変数に関する超初歩的な質問

このQ&Aのポイント
  • シェルの環境変数についての超初歩的な質問です。
  • 実際にやってみたところ、例文が間違っている結果になったため、疑問を持ちました。
  • サブシェルが起動する条件について疑問があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.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. コマンド置換の場合 です。

noname#225432
質問者

お礼

ありがとうございます。シェルコマンドインタープリターの解釈の順番というものが掴めました。

その他の回答 (4)

noname#223623
noname#223623
回答No.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 にしてね」 という意味になります。

参考URL:
http://kaworu.jpn.org/kaworu/2008-03-05-1.php
noname#225432
質問者

お礼

ありがとうござます。インタープリタに2段階手順を踏ませれば、一時的にNEWの値のままで行けるのですね。

  • h271015
  • ベストアンサー率71% (62/87)
回答No.3

No2です。 申し訳ありません。No2で回答した内容ですが、誤ってました。無視してください。

noname#225432
質問者

お礼

ありがとうございます。

  • h271015
  • ベストアンサー率71% (62/87)
回答No.2

元の例文がどうなっているのか分かりませんが、以下を実行されたということですよね? 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)
回答No.1

HOME=/New; echo "My Home is $HOME" シェルの区切りは空白じゃなくてセミコロンか改行ですよ。

noname#225432
質問者

お礼

ありがとうございます。と言うことは、3行目の HOME=/New は、文法間違いという理由で、/Newが代入されなかったという理解で良いのですか?例文がおかしかっただけなのでしょうか。

関連するQ&A