Re: 問題ID: 15750
yokoyama68
投稿数: 28
>解釈的には使用中のシェル(bash等)から違うシェル?(sh等 )になるため、
>環境変数も変わるという感じなんですかね・・。
>もし解説して頂ける方いましたらよろしくお願いします。
おおむねその解釈であっています
この問題自体がUnix、Linuxのプロセスと環境変数のトリッキーな
仕様を対象とした問題となっております
そのため、説明が長くなりますがご容赦ください
環境変数とはプロセスの環境(挙動)に関する変数です
プロセス毎に別々の値を持っています
現在起動しているbashも1つのプロセスで、PATHという
環境変数を持っています
シェルからプログラムを実行するとプロセスが生成されます
例えば、シェルから"ls"と入力すると
1.lsというプログラムからプロセスが生成される
2.ファイルの一覧が表示される
3.lsプロセスはこれで終了となり、生成元のシェルへ戻る
という流れになります
この時、生成されるlsプロセスは生成元のシェルの環境変数と
まったく同じ環境変数がコピーされます
その環境変数もlsプロセスが終了時にプロセスと一緒に破棄されます
問題では環境変数PATHをシェルスクリプトによって設定するのが
主題となっております
ここで、"sh setpath.sh"ですが
1.現在のシェルから"sh setpath.sh"が新しいプロセス(sh)として生成される
2.新しいプロセス(sh)上で"setpath.sh"が実行され,
"PATH=$PATH:/home/public"に変更される
※変更されるのはプロセス(sh)のPATHです
呼び出し元シェルのPATHは影響を受けません
3."setpath.sh"の実行が完了し、プロセス(sh)が終了する
4.その際に、"PATH=$PATH:/home/public"の内容も破棄される
5.現在のシェルに戻ってくる
そのため、最終的にはPATHを変更していないことになります
"source setpath.sh" or ". setpath.sh" (. はsourceの別名)ですが
これらはシェルでの特殊(例外的)コマンドになります
1.新しいプロセスを生成せずに、現在のシェル上で直接"setpath.sh"を実行
2."PATH=$PATH:/home/public"によりPATHの値が変更される
3."setpath.sh"が終了しても、現在のシェルは終了されないため、
PATHの値は設定されたものが残る
これで意図したとおり、現在のシェルの環境変数をシェルスクリプトによって
変更することができます
そもそもsource (.)が現在のシェルに対して変更を加えるための
特殊コマンドという位置付けです
>環境変数も変わるという感じなんですかね・・。
>もし解説して頂ける方いましたらよろしくお願いします。
おおむねその解釈であっています
この問題自体がUnix、Linuxのプロセスと環境変数のトリッキーな
仕様を対象とした問題となっております
そのため、説明が長くなりますがご容赦ください
環境変数とはプロセスの環境(挙動)に関する変数です
プロセス毎に別々の値を持っています
現在起動しているbashも1つのプロセスで、PATHという
環境変数を持っています
シェルからプログラムを実行するとプロセスが生成されます
例えば、シェルから"ls"と入力すると
1.lsというプログラムからプロセスが生成される
2.ファイルの一覧が表示される
3.lsプロセスはこれで終了となり、生成元のシェルへ戻る
という流れになります
この時、生成されるlsプロセスは生成元のシェルの環境変数と
まったく同じ環境変数がコピーされます
その環境変数もlsプロセスが終了時にプロセスと一緒に破棄されます
問題では環境変数PATHをシェルスクリプトによって設定するのが
主題となっております
ここで、"sh setpath.sh"ですが
1.現在のシェルから"sh setpath.sh"が新しいプロセス(sh)として生成される
2.新しいプロセス(sh)上で"setpath.sh"が実行され,
"PATH=$PATH:/home/public"に変更される
※変更されるのはプロセス(sh)のPATHです
呼び出し元シェルのPATHは影響を受けません
3."setpath.sh"の実行が完了し、プロセス(sh)が終了する
4.その際に、"PATH=$PATH:/home/public"の内容も破棄される
5.現在のシェルに戻ってくる
そのため、最終的にはPATHを変更していないことになります
"source setpath.sh" or ". setpath.sh" (. はsourceの別名)ですが
これらはシェルでの特殊(例外的)コマンドになります
1.新しいプロセスを生成せずに、現在のシェル上で直接"setpath.sh"を実行
2."PATH=$PATH:/home/public"によりPATHの値が変更される
3."setpath.sh"が終了しても、現在のシェルは終了されないため、
PATHの値は設定されたものが残る
これで意図したとおり、現在のシェルの環境変数をシェルスクリプトによって
変更することができます
そもそもsource (.)が現在のシェルに対して変更を加えるための
特殊コマンドという位置付けです
投稿ツリー
-
問題ID: 15750
(jonathan4649, 2021-5-10 19:48)
- Re: 問題ID: 15750 (yokoyama68, 2021-5-10 20:50)
- Re: 問題ID: 15750 (jonathan4649, 2021-5-10 22:07)
- Re: 問題ID: 15750 (jonathan4649, 2021-5-10 22:07)