• ベストアンサー

Shellでの環境変数

Shell(親)ではShell(子)を呼び出しています。 Shell(子)では環境変数を設定しており、設定直後にechoすると設定した環境変数の内容が出力されます。 ですが、Shell(子)からShell(親)に戻った直後にShell(子)で設定した環境変数をechoすると、値が空になっています。 なんで空になるのかわかりません。 お手数かけますが、ご教授おねがいします。 <Shell(親)の内容> ./Shell(子) echo "TESTDIR(親):$TESTDIR" <Shell(子)の内容> TESTDIR=/dev/fs/test export TESTDIR echo "TESTDIR(子):$TESTDIR" <Shell(親)の実行結果> TESTDIR01:/dev/fs/test TESTDIR02: ←空白 ※環境 OS:Windows 2003 Server Shell:SUAのKorn Shell

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

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

通常、環境変数はプロセス間で共有しているのではなく、子プロセスが起動するときに親プロセスからコピーしているだけです。 子プロセスで環境変数を変更しても親プロセスには反映されませんし、子プロセスを起動してから親プロセスで環境変数を変更しても子プロセスには反映されません。

touzuki
質問者

お礼

的確な回答ありがとうございます。 理解できました。

その他の回答 (1)

  • splwtr
  • ベストアンサー率16% (75/461)
回答No.1

基本的に親の環境変数を子は引き継ぎません。 (fork() , exec() して子供を作る場合です) UNIX系の場合ですが、Windowsもそうなのかもしれませんね? 起動オプションで変更可能かもしれません。 また、同じ環境変数のファイルをロードすることで対処できると 思います。 回答になってませんね。失礼しました。

touzuki
質問者

お礼

Fork-Exec、Shell初心者なので勉強になりました。 言語の仕様を把握していないとだめですね…。 勉強します。 ありがとうございました。

関連するQ&A

  • bashでの変数の引渡し方法

    bashを使用するのが初めてなので教えてください。 shellscriptの中で変数を設定するのに共通変数設定用の子Shellを実行して変数を設定したいと思っていますが、うまく動きません。どのように設定したらいいのでしょうか。cshのときはsetenvでよかったのですが。。 親shell(hoge.sh) -------------- #!/bin/sh ./setenv.sh #変数設定用子Shell echo $USER exit 0 -------------- 子Shell(setenv.sh) -------------- #!/bin/sh USER="hoge" exit 0 -------------- 実行すると以下のようになります。 $./hoge.sh USER: not found

  • CSHの環境変数の設定

    CSHで外部で定義したconfigファイルから変数を読み込み そのシェル及び子シェル内で有効な変数として使用したのですが どのような方法がありますでしょうか? 以下の方法だと親シェルからでは子シェルで設定した変数が読み込めないため困っています。 config.csh #!/bin/csh -f setenv AAA aaa test.csh #!/bin/csh -f set APP_ROOT = `dirname $0` cd $APP_ROOT set CONFIG_FILE=$APP_ROOT"/config.csh" echo $AAA

  • power shell の変数について。

    宜しくお願いします。 "power shellで、iniファイルを読み込み、それをrobocopyの値に代入する"プログラムを作成しています。 サイトや、サンプルコード等を参考にしながら、プログラムの作成に取り組んでいるのですが、 想定通りの動きをしてくれません。 以下が現時点のモジュール(.ps1と.ini)です。 #####【実行モジュール(robocopy.ps1)】##### if (!(test-path -pathtype Leaf D:\testmodule\test_ini.ps1)) { $MSG = (get-date -Format "yyyy/MM/dd HH:mm:ss.ff ") + ` "iniファイル無し" write-host $MSG exit 8 } else { . D:\testmodule\test_ini.ps1 } #ここでiniファイルの変数を、robocopyの値($***)に代入する処理を使用するのでしょうか? robocopy $FORDER $BK_FORDER $TXT $XLS /IS /MIR /COPYALL #####【定義ファイル(test.ini)】##### # 対象txt "testsystem.txt" # 対象xls "test.xls" # バックアップ元フォルダパス "M:\testforder" # バックアップ先フォルダパス "W:\bkupforder" 稼働内容としては、 【power shell実行 → iniファイルの読み込み → iniファイルから変数を使用し、robocopyの値($***)に代入し実行】 です。 特に、"iniファイルから変数を使用し、robocopyの値($***)に代入"する方法が分からず困っています。 iniで指定した変数をrobocopyの値に代入し、稼働内容通りに動かすには、 どのようなプログラムを作成すれば良いのでしょうか? お手数をかけますが、ご教授を宜しくお願いします。

  • 環境変数の設定(PATH)

    今、環境変数の設定(PATHの設定)を行っています。 OSは、RedHat9です。 スーパーユーザーのPATHは、 echo $PATHコマンドで見ると /usr/local/sbin:/usr/bin:/home/user1/test となっている。 しかし.bash_profileをみると PATHには、/usr/local/sbin:/usr/binしか 設定しておらず、 ユーザー(user1)の.bash_profileにも /home/user1/testをPATHに設定していない。 どこかでPATH設定を行っていると思いますが わかりません。 PATHの設定は、.bash_profileを設定するとは わかっているのですが、 スーパーユーザーの.bash_profileの記述と echo $PATHで見たPATHの構成がことなるのは なぜでしょうか? よろしくお願い致します。

  • シェルスクリプトのコマンド グループ化における変数の有効範囲について教

    シェルスクリプトのコマンド グループ化における変数の有効範囲について教えてください。 中括弧"{ }"を使うと親プロセス(=その実行中のプロセス)にて実行、 小括弧"( )"を使うとサブシェル(=子プロセス)にて実行されると認識しています。 また環境変数は子プロセスに引き継がれ、シェル変数は引き継がれないと認識しています。 以下のシェルスクリプト(Bシェル)でテストしたところ、続くような結果となりました。 ~スクリプト内容~ #!/bin/sh ##TEST1 VAR01=AAA { echo 中括弧内でVAR01は${VAR01}; } ( echo 小括弧内でVAR01は${VAR01}; ) ##TEST2 { VAR02=BBB; echo 中括弧内でVAR02は${VAR02}; } echo 外でVAR02は${VAR02} ##TEST3 ( VAR03=CCC; echo 小括弧内でVAR03は${VAR03}; ) echo 外でVAR03は${VAR03} ~実行結果~ 中括弧内でVAR01はAAA 小括弧内でVAR01はAAA 中括弧内でVAR02はBBB 外でVAR02はBBB 小括弧内でVAR03はCCC 外でVAR03は  VAR02、VAR03の結果は納得できます。 またVAR01が{ }に引き継がれているのも納得できました。 しかし、VAR01はシェル変数として作成した(exportによる環境変数化はしていない)にも関わらず、子プロセスである( )内処理にも引き継がれているのはなぜなのでしょうか? 

  • 環境変数の取得について

    Javaプログラムで環境変数を取得することって可能ですか?? 例えば任意の環境変数%TEST%なんかを設定してから実行したら 取得可能ですか??(OSはUnix上です) もしくはプロパティファイルかなんか設定ファイルを使用しても良いと考えているのですが、Unix上でResourceBundleクラスを使用するとき、ファイルの配置場所はどこにあれば良いのでしょうか??

    • ベストアンサー
    • Java
  • バッチファイルで環境変数が設定されません

    よろしくお願いいたします。 Windows XP Pro の command.com において、バッチファイルの中で set コマンドを使って環境変数を設定しても、バッチから抜けると環境変数の設定ができていません。 バッチ終了後の環境変数は全てバッチ開始前と同じ状態です。 command.com のプロンプトで set コマンドを実行すると、環境変数はセットした内容に変化もしくは追加されます。 cmd.exe ではバッチからでもプロンプトからでも set コマンドで環境変数を操作できます。 なぜ command.com 上のバッチから操作できないのかわからず、不便でかないません。 アドバイスをよろしくお願いいたします。 @echo off set foo=word path=c:\ echo %foo% echo %path% 上記バッチを実行すると word c:\ と表示されますが、set コマンドで確認すると FOO は存在しません PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;... と表示されます。 これはバッチ実行前の値です。

  • CLASSPATHと環境変数について

     Java初心者です、宜しくお願いします。  SJC-Pの問題です、以下の問題の意味が分かりません。 <問題>  現在CLASSPATH環境変数に設定されているパスが/AA/BBとします。  Testクラスが/AA/BB/CC/DDにあり、カレントディレクトリが/AAである場合、 次のプログラムTestが正しく実行される回答を選べという問題があります。  ===================================================  Package CC.DD ;  public class Test {   public static void main (String[] args) {  System . out . print(“java”) ;  }  }  ===================================================  答えは「java CC . DD . Test」なのですが、「現在CLASSPATH環境変数に設定されている パスが/AA/BBとします。」という意味が理解できません。  「現在CLASSPATH環境変数に設定されているパス」とはどのような意味でしょうか。  現在フォルダは、/CC/DDしか作成されていないという意味でしょうか、それにしても、 設問は「Testクラスが/AA/BB/CC/DDにあり」と書かれていることから、既にCC/DDフォルダ は、 BBフォルダの直下に作成されていると考えるのが正しいと思うのですが。  そもそも、「現在CLASSPATH環境変数に設定されているパス」とは、どのような意味を持つ のでしょうか。  以上宜しくお願いします。

    • ベストアンサー
    • Java
  • VBのshellについて。

    すみません。教えてください。 環境OS:winXP ソフト:VB6.0 sp5 内容:shellを利用してbatファイルをキックさせようとしていますがうまくいかないのです。 --VBソース-- Str = "C:\program file\SOFT\test.bat" & "/w" nR = shell(Str,1) -- batファイルの中身-- @echo dir %1 > "C:\Program File\SOFT\log.txt" 以上のデータなのですが、EXEを作成し、Shellを起動するとエラーが帰ります。 確認したところ、windows2000では問題ないのですが、XPではProgram Fileのスペースが問題で、エラーになってしまうのです。 教えていただきたいのは、 1.本当にXPではスペースのあるディレクトリ名はエラーになるのかということ。 2.もしエラーになるのであれば、対応策。 の上記の2点を教えてくださいませ。 いろいろ試し、探しているのですが、なかなか見つからず困っています。 XPのみできないっていうのも半信半疑だし・・・・ お願いします。

  • cygwin gcc 環境変数

    質問させて頂きます。 よろしくお願いします。 URL http://www.knatech.info/Dev-cygwin-install.html#Cygwin_.E3.81.AE.E3.83.80.E3.82.A6.E3.83.B3.E3.83.AD.E3.83.BC.E3.83.89.E3.81.A8.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB 上記のサイトから、cygwinとgccをインストールしましたが、 環境変数のファイルがある場所がわかりません。 サイトには環境変数のファイルがある場所が書いてありません。 また、メールアドレス等が載ってないため管理者に連絡することができません。 上記のサイトの環境変数の設定をするには、 Windowsからの環境変数の設定の仕方でできるのでしょうか? すいませんが、よろしくお願いします。

専門家に質問してみよう