Linux におけるシェル環境と設定の管理

CompTIABeginner
オンラインで実践に進む

はじめに

この実験では、Linux におけるシェル環境の管理と設定の基本を学びます。まず、ローカル変数と環境変数の作成から始め、echoexportenv などのコマンドを使用して、シェルセッション内でのスコープ(有効範囲)と利用可能性の決定的な違いを理解します。

この基礎の上に、変数やエイリアス(別名)が子シェルにどのように継承されるかを探ります。また、set -o allexport オプションを使用して変数の自動エクスポートを制御する方法や、.bashrc ファイルを修正してカスタム設定をセッション間で永続化させる方法についても学習します。

ローカル変数と環境変数の作成と区別

このステップでは、シェル変数の作成と管理方法を学びます。Zsh のような Linux シェルでは、情報を保存するために変数が使用されます。主に次の 2 種類の変数があります。

  • ローカル変数(またはシェル変数):作成されたシェル内でのみ有効です。
  • 環境変数:現在のシェルだけでなく、そのシェルから起動されたすべての子プロセスでも利用可能です。

これらの変数を操作するために、echoexportenv コマンドを使用します。すべてのコマンドはターミナルで実行します。

まず、ローカル変数を作成しましょう。すでに ~/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)」と呼ばれます。この概念は、シェル環境の構造やスクリプトの実行方法を理解する上で非常に重要です。前のステップで作成した変数 flowernut が子シェルに引き継がれる(継承される)かどうかをテストします。

まず、現在の親シェルのプロセス 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 オプションの現在のステータスを確認しましょう。すべてのシェルオプションをリストし、grepallexport を絞り込みます。

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)起動ファイルに追加し、環境のカスタマイズを永続化する方法を学びました。