はじめに
この実験では、Linux におけるシェル環境の管理と設定の基本を学びます。まず、ローカル変数と環境変数の作成から始め、echo、export、env などのコマンドを使用して、シェルセッション内でのスコープ(有効範囲)と利用可能性の決定的な違いを理解します。
この基礎の上に、変数やエイリアス(別名)が子シェルにどのように継承されるかを探ります。また、set -o allexport オプションを使用して変数の自動エクスポートを制御する方法や、.bashrc ファイルを修正してカスタム設定をセッション間で永続化させる方法についても学習します。
ローカル変数と環境変数の作成と区別
このステップでは、シェル変数の作成と管理方法を学びます。Zsh のような Linux シェルでは、情報を保存するために変数が使用されます。主に次の 2 種類の変数があります。
- ローカル変数(またはシェル変数):作成されたシェル内でのみ有効です。
- 環境変数:現在のシェルだけでなく、そのシェルから起動されたすべての子プロセスでも利用可能です。
これらの変数を操作するために、echo、export、env コマンドを使用します。すべてのコマンドはターミナルで実行します。
まず、ローカル変数を作成しましょう。すでに ~/project ディレクトリにいるターミナルで、次のコマンドを入力して flower という名前の変数を作成し、値 rose を割り当てます。等号(=)の前後にスペースを入れないように注意してください。
flower=rose
変数が作成されたことを確認するには、echo コマンドを使用してその値を表示します。変数名の前のドル記号($)は、シェルに対して変数をその値に置き換えるよう指示するものです。
echo $flower
ターミナルに変数の値が表示されるはずです。
rose
次に、このローカル変数がシェルの環境の一部であるかどうかを確認しましょう。env コマンドはすべての環境変数をリスト表示します。出力を grep にパイプして、作成した変数を検索します。
env | grep flower
このコマンドは何も出力しません。これは期待通りの結果であり、flower が環境変数ではなくローカル変数であることを裏付けています。
続いて、環境変数を作成しましょう。手順は似ていますが、export コマンドを使用します。このコマンドは変数を作成し、現在のシェルのすべての子プロセスに引き継がれるようにマークします。値 almond を持つ nut という名前の環境変数を作成します。
export nut=almond
先ほどと同様に echo で確認します。
echo $nut
コマンドは nut 変数の値を出力します。
almond
今度は、env コマンドを再度使用して、環境内に存在するか確認します。
env | grep nut
今回はコマンドによって変数が検出・表示され、nut が環境変数であることが確認できます。
nut=almond
これで、ローカル変数と環境変数の両方を正常に作成し、シェルの環境における扱いの根本的な違いを確認できました。これらの変数は、次のステップで使用するために設定したままにしておきます。
子シェルにおける変数とエイリアスの継承テスト
このステップでは、現在のシェルから新しいシェルを起動したときに、変数やエイリアスがどのように振る舞うかを探ります。この新しいシェルは「子シェル(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
何も返されません。
この演習を通じて、シェルの動作に関する重要な原則を学びました。環境変数は子プロセスに継承されますが、ローカル変数やエイリアスは継承されません。
set -o allexport による変数の自動エクスポート制御
このステップでは、allexport という強力なシェルオプションについて学びます。通常、変数を作成した際、それを環境変数にするには明示的に export コマンドを使用する必要があります。しかし、allexport オプションを有効にすると、新しく定義したすべての変数を自動的にエクスポートするようにシェルに指示できます。これは、すべての変数にサブプロセスからアクセスする必要があるスクリプトなどで便利なショートカットになります。
シェルオプションは、シェルの動作を変更する内部設定です。set -o [オプション名] で有効にし、set +o [オプション名] で無効にできます。
まず、allexport オプションの現在のステータスを確認しましょう。すべてのシェルオプションをリストし、grep で allexport を絞り込みます。
set -o | grep allexport
デフォルトでは、このオプションは無効になっています。出力には off と表示されます。
allexport off
では、allexport オプションを有効にしてみましょう。
set -o allexport
確認コマンドを再度実行して、設定が変更されたことを確認します。
set -o | grep allexport
今回は、オプションが on であることが確認できます。
allexport on
allexport が有効な状態では、作成した変数はすべて自動的に環境変数になります。これをテストしてみましょう。export コマンドを使わずに、truck という名前の新しい変数を作成します。
truck=chevy
次に、env コマンドを使用して、truck が環境内に存在するか確認します。
env | grep truck
export を使用していないにもかかわらず、truck 変数がリストに表示されます。これは allexport オプションが有効だったためです。
truck=chevy
この機能は非常に便利ですが、意図しない変数のエクスポートを避けるため、必要がなくなったら無効にするのが良い習慣です。allexport を無効にしましょう。
set +o allexport
最後に、無効になったことを確認します。
set -o | grep allexport
出力は再び off になります。
allexport off
これ以降に作成する新しい変数は、明示的に export コマンドを使用しない限り、デフォルトでローカル変数になります。
.bashrc ファイルを使用したシェルオプションの永続化
このステップでは、シェルのカスタマイズを永続的にする方法を学びます。設定したエイリアス、関数、シェルオプションは一時的なものであり、ターミナルセッションを閉じると失われます。これらを永続的に保存するには、シェルの設定ファイルに追加する必要があります。
タイトルには Bash シェルの設定ファイルである .bashrc とありますが、この実験環境では Zsh シェルを使用しています。Zsh における同等の設定ファイルは ~/.zshrc です。このファイルは、新しい対話型シェルを開くたびに自動的に実行されるスクリプトであり、個人設定を保存するのに最適な場所です。
ここでは、noclobber シェルオプションを永続化する練習をします。noclobber オプションは、出力リダイレクト(>)を使用する際に、既存のファイルを誤って上書きしてしまうのを防ぐ機能です。
まず、nano テキストエディタを使用して、~/.zshrc ファイルに noclobber オプションを追加します。~ 記号はホームディレクトリ(/home/labex)のショートカットです。
nano ~/.zshrc
このコマンドにより、nano エディタで ~/.zshrc ファイルが開きます。矢印キーを使用してカーソルをファイルの最後尾まで移動し、次の行を追加してください。
set -o noclobber
ファイルを保存して nano を終了します。保存するには Ctrl+O(Write Out)を押し、ファイル名を確認するために Enter を押し、次に Ctrl+X を押して終了します。
コマンドプロンプトに戻りました。現在のシェルで noclobber オプションが有効になっているか確認してみましょう。
set -o | grep noclobber
出力は以下のようになります。
noclobber off
なぜ off なのでしょうか?それは、現在のシェルセッションが、先ほど ~/.zshrc ファイルに加えた変更をまだ読み込んでいないからです。このファイルは、新しいシェルが起動したときにのみ読み込まれます。
これを証明するために、新しい子シェルを起動してみましょう。
zsh
新しいシェルに入りました。ここで noclobber の状態を確認します。
set -o | grep noclobber
今度は、出力が以下のようになります。
noclobber on
これにより、新しいシェルが正しく ~/.zshrc ファイルを読み込み、設定を適用していることが確認できました。子シェルを終了して、元の親シェルに戻ります。
exit
では、シェルを閉じたり開き直したりせずに、現在のシェルに変更を適用するにはどうすればよいでしょうか?それには source コマンドを使用します。このコマンドは、指定されたファイルの内容を現在のシェルのコンテキストで読み込んで実行します。
source ~/.zshrc
source コマンドによって、設定ファイル内の set -o noclobber という行が実行されました。元のシェルで noclobber が有効になったか確認しましょう。
set -o | grep noclobber
出力は on になっているはずです。
noclobber on
~/.zshrc ファイルを編集してシェル設定を永続化する方法と、source コマンドを使用してその変更を現在のセッションに即座に適用する方法を習得しました。
まとめ
この実験では、Linux シェル環境を管理するための基本的な概念を学びました。現在のシェルに限定されるローカル変数と、すべての子プロセスに継承される環境変数の両方を作成する実習を行いました。変数の値を表示する echo、環境変数を作成する export、それらを一覧表示する env といった主要なコマンドを活用しました。また、子シェルを起動して、親シェルからどの変数やエイリアスが正常に引き継がれるかをテストすることで、継承の概念をさらに深く理解しました。
さらに、シェル設定を制御し永続化する方法についても探求しました。set -o allexport オプションを使用して、その後に定義されたすべての変数を自動的にエクスポートし、子プロセスで利用可能にするプロセスを簡略化しました。最後に、カスタム変数、エイリアス、シェルオプションを将来のすべてのターミナルセッションで利用できるようにするため、設定を .bashrc(または .zshrc)起動ファイルに追加し、環境のカスタマイズを永続化する方法を学びました。



