子シェルにおける変数とエイリアスの継承テスト
このステップでは、現在のシェルから新しいシェルを起動したときに、変数やエイリアスがどのように振る舞うかを探ります。この新しいシェルは「子シェル(child shell)」と呼ばれ、元のシェルは「親シェル(parent shell)」と呼ばれます。この概念は、シェル環境の構造やスクリプトの実行方法を理解する上で非常に重要です。前のステップで作成した変数 flower と nut が子シェルに引き継がれる(継承される)かどうかをテストします。
まず、現在の親シェルのプロセス ID(PID)を確認しましょう。Linux のすべてのプロセスには固有の PID があります。echo $$ コマンドで表示できます。
echo $$
出力は数字になります。これが現在のシェルの PID です。例:
123
次に、zsh と入力して Enter キーを押し、子シェルを起動します。これにより、現在のプロセスの中に新しいシェルプロセスが作成されます。
zsh
これで新しいシェルセッションに入りました。これを確認するために、親プロセス ID(PPID)を含む詳細なプロセス情報を表示する ps -f コマンドを使用します。
ps -f
出力を確認してください。2 つの zsh プロセスが表示されます。新しい zsh プロセスの PID は、先ほどメモした親シェルの PID と一致する PPID を持っているはずです。
UID PID PPID C STIME TTY TIME CMD
labex 123 1 0 10:00 pts/0 00:00:00 zsh
labex 456 123 0 10:01 pts/0 00:00:00 zsh
labex 457 456 0 10:01 pts/0 00:00:00 ps -f
この例では、新しいシェル(PID 456)は元のシェル(PPID 123)の子プロセスです。
では、変数をテストしましょう。この子シェルで、ローカル変数 flower の値を表示してみます。
echo $flower
何も出力されません。これは、ローカル変数が作成されたシェル内に限定され、子シェルには継承されないためです。
次に、環境変数 nut を確認します。
echo $nut
今回は、変数の値が表示されます。
almond
これは、ローカル変数とは異なり、環境変数が子シェルに継承されることを示しています。
ここで、exit コマンドを使用して親シェルに戻ります。
exit
元のシェルに戻りました。次に、エイリアス(alias)で同様のテストを行います。エイリアスはコマンドのショートカットです。ls -ld /etc を実行する ldetc という名前のエイリアスを作成します。
alias ldetc='ls -ld /etc'
alias と入力して、エイリアスが作成されたことを確認します。
alias ldetc
エイリアスの定義が表示されるはずです。
ldetc='ls -ld /etc'
エイリアスを実行してテストします。
ldetc
コマンドが実行され、/etc ディレクトリの詳細が表示されます。
drwxr-xr-x 1 root root 4096 Oct 10 10:00 /etc
次に、別の子シェルを開いて、エイリアスが継承されるか確認します。
zsh
新しい子シェルの中で、ldetc エイリアスを使ってみます。
ldetc
エラーメッセージが表示されます。エイリアスもローカル変数と同様に、子シェルには継承されないためです。
zsh: command not found: ldetc
親シェルに戻ります。
exit
最後に、unalias コマンドを使用して親シェルからエイリアスを削除し、後片付けをします。
unalias ldetc
再度リスト表示を試みて、削除されたことを確認します。
alias ldetc
何も返されません。
この演習を通じて、シェルの動作に関する重要な原則を学びました。環境変数は子プロセスに継承されますが、ローカル変数やエイリアスは継承されません。