問題ID: 15750
- フォーラムは新サイトへ移行しました。
- このフォーラムではゲスト投稿が禁止されています
問題ID: 15750
msg# 1
jonathan4649
投稿数: 9
現在の環境変数PATHに新たなパス「/home/public」を追加するスクリプト「setpath.sh」を作成した。ファイルの内容とパーミッションは以下の通りである。
$cat setpath.sh
#!/bin/bash
PATH=$PATH:/home/public
$ls -l setpath.sh
=rw-rw-r--. 1 test test 36 jun 8 09:03 setpath.sh
このスクリプトの設定を即座に反映させるコマンドは次のうちどれか。(2つ選択)
sh setpath.sh
exe setpath.sh
source setpath.sh
. /setpath.sh
. setpath.sh
解説のサブシェル内で実行されるため設定を反映できませんという内容が理解できませんでした。
また、sh setpath.shの解説にもシェルを起動してシェルスクリプトを実行するため設定を反映できません。というのも理解できませんでした。
解釈的には使用中のシェル(bash等)から違うシェル?(sh等 )になるため、環境変数も変わるという感じなんですかね・・。
もし解説して頂ける方いましたらよろしくお願いします。
$cat setpath.sh
#!/bin/bash
PATH=$PATH:/home/public
$ls -l setpath.sh
=rw-rw-r--. 1 test test 36 jun 8 09:03 setpath.sh
このスクリプトの設定を即座に反映させるコマンドは次のうちどれか。(2つ選択)
sh setpath.sh
exe setpath.sh
source setpath.sh
. /setpath.sh
. setpath.sh
解説のサブシェル内で実行されるため設定を反映できませんという内容が理解できませんでした。
また、sh setpath.shの解説にもシェルを起動してシェルスクリプトを実行するため設定を反映できません。というのも理解できませんでした。
解釈的には使用中のシェル(bash等)から違うシェル?(sh等 )になるため、環境変数も変わるという感じなんですかね・・。
もし解説して頂ける方いましたらよろしくお願いします。
Re: 問題ID: 15750
msg# 1.1
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 (.)が現在のシェルに対して変更を加えるための
特殊コマンドという位置付けです
Re: 問題ID: 15750
msg# 1.2
jonathan4649
投稿数: 9
丁寧な解説ありがとうございます!
別なシェルでプロセスを作成して暫定的に環境変数を変えても、プロセスと一緒に環境変数事消えてしまうのでPATHが追加されないて事ですね。
理解できました!ありがとうございます!
別なシェルでプロセスを作成して暫定的に環境変数を変えても、プロセスと一緒に環境変数事消えてしまうのでPATHが追加されないて事ですね。
理解できました!ありがとうございます!
Re: 問題ID: 15750
msg# 1.3
jonathan4649
投稿数: 9
丁寧な解説ありがとうございます!
別なシェルでプロセスを作成して暫定的に環境変数を変えても、プロセスと一緒に環境変数事消えてしまうのでPATHが追加されないて事ですね。
理解できました!ありがとうございます!
別なシェルでプロセスを作成して暫定的に環境変数を変えても、プロセスと一緒に環境変数事消えてしまうのでPATHが追加されないて事ですね。
理解できました!ありがとうございます!