Re: 問題ID: 15750

この質問の投稿一覧へ

なし Re: 問題ID: 15750

msg# 1.1
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2021-5-10 20:50 | 最終変更
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 (.)が現在のシェルに対して変更を加えるための
特殊コマンドという位置付けです

投稿ツリー

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.