Linux の環境変数

LinuxBeginner

はじめに

Linux の環境変数に関する実践的な実験へようこそ!環境変数は、コンピュータ上で実行されているプロセスの動作に影響を与える動的な値です。これらはシステムの構成やプログラムの実行において極めて重要な役割を果たします。環境変数をマスターすることで、Linux のシステム管理やソフトウェア開発に不可欠なスキルを身につけることができます。

この実験では、環境変数の作成、表示、変更、および削除の方法を学びます。また、これらの変更を永続化する方法を探求し、Linux にあらかじめ組み込まれている重要な環境変数についても理解を深めます。初心者の方も、知識を再確認したい方も、この実験を通じて貴重な実務経験を得ることができるでしょう。

それでは、始めましょう!

Linux における変数の理解

環境変数について深く掘り下げる前に、まずは基本的なシェル変数から始めましょう。これにより、Linux における変数の概念を理解しやすくなります。

  1. ターミナルを開きます。現在は /home/labex/project ディレクトリにいるはずです。もし違う場合は、次のコマンドを使用してこのディレクトリに移動してください。

    cd /home/labex/project
    
  2. 次に、シンプルなシェル変数を作成してみましょう。Linux では、名前に値を代入するだけで変数を作成できます。my_var という名前の変数を作成してみましょう。

    my_var="Hello, Linux"
    

    重要な注意点: Bash(およびこの実験で使用している Zsh)で変数を代入する際、等号(=)の前後にスペースを入れてはいけませんmy_var = "Hello, Linux"my_var= "Hello, Linux" と記述するとエラーになります。

  3. 変数の値を確認するには、変数名の前に $ を付けて echo コマンドを使用します。$ は、シェルに対して変数の値を展開(置換)するように指示します。

    echo $my_var
    

    次のような出力が表示されるはずです。

    Hello, Linux
    
  4. 変数は、他のコマンド内や代入時にも使用できます。例えば:

    echo "The value of my_var is: $my_var"
    

    これにより、The value of my_var is: Hello, Linux と出力されます。

素晴らしい!最初のシェル変数を作成して使用することができました。ただし、この変数は現在のシェルセッション内でのみ有効です。新しいターミナルウィンドウやタブを開くと、この変数はそこでは利用できません。ここで環境変数が役立ちます。

環境変数の導入

基本的な変数を理解したところで、環境変数について見ていきましょう。環境変数とは、シェルのあらゆる子プロセス(child process)から利用できる変数のことです。つまり、そのシェルから実行されるスクリプトやプログラムからもアクセスできることを意味します。

  1. 現在のすべての環境変数を表示するには、env コマンドを使用します。

    env
    

    変数の長いリストが表示されます。今はすべてを理解できなくても心配いりません。重要なものについては後ほど説明します。

  2. 最も重要な環境変数のひとつに PATH があります。中身を確認してみましょう。

    echo $PATH
    

    PATH 変数は、システムが実行プログラムを探すディレクトリのリストを保持しています。各ディレクトリはコロン(:)で区切られています。

  3. では、独自の環境変数を作成してみましょう。環境変数を作成するには export コマンドを使用します。

    export MY_ENV_VAR="This is an environment variable"
    

    export コマンドを使うことで、その変数が子プロセスからも利用可能になります。これがシェル変数と環境変数の決定的な違いです。

  4. この違いを確認するために、通常のシェル変数と環境変数の両方にアクセスしようとするシェルスクリプトを作成してみましょう。cat コマンドと heredoc(ヒアドキュメント)を使用します。これは複数行のテキストをファイルに書き込む一般的な方法です。

    cat << 'EOF' > test_vars.sh
    #!/bin/bash
    echo "Shell variable: $my_var"
    echo "Environment variable: $MY_ENV_VAR"
    EOF
    

    スクリプトに実行権限を与えます。

    chmod +x test_vars.sh
    

    スクリップを実行します。

    ./test_vars.sh
    

    環境変数(MY_ENV_VAR)にはアクセスできますが、シェル変数(my_var)にはアクセスできないことがわかります。これは my_var がエクスポートされていないため、子プロセス(このスクリプトなど)がその存在を知らないからです。

  5. MY_ENV_VAR が環境変数として登録されているか確認するために、再度 env コマンドを使用しますが、今回は grep で出力を絞り込みます。

    env | grep MY_ENV_VAR
    

    出力に新しい変数が表示されるはずです。

  6. 新しい環境変数の値を直接確認することもできます。

    echo $MY_ENV_VAR
    

よくできました!最初の環境変数を作成し、シェル変数との違いを確認できました。重要な違いは、export で作成された環境変数は子プロセスから利用可能ですが、シェル変数は利用できないという点です。

環境変数とシェル変数には、それぞれ独自のスコープ(有効範囲)があります。変数をエクスポート(例:export MY_ENV_VAR="something")すると、そのシェルから起動されたサブプロセス(同じシェルから実行されるスクリプトなど)で利用可能になります。しかし、完全に別のシェルセッションを開いた場合、スタートアップファイル(.zshrc.bashrc など)で明示的に設定していない限り、現在のシェルの変数は引き継がれません。

言い換えると:

  • 通常のシェル変数は、現在のセッション内でのみ参照可能です。
  • エクスポートされた変数は、そのセッションから起動された子プロセスでも利用可能です。
  • シェルのスタートアップファイル(.zshrc など)で設定された変数は、そのシェルのすべての新しいセッションに適用されます。

各プロセスは独自の環境を保持しているため、他のユーザーや他のシェルの変数を直接読み取ることはできません。新しいシェルを起動すると、親シェルのエクスポートされた変数のコピーは受け取りますが、export なしで設定された変数は受け取りません。

次のステップでは、環境変数を永続的に設定する方法を学びます。

変数の永続性レベル

これらの変数タイプと永続性レベルの違いを視覚化するために、以下の概要図を参考にしてください。

graph LR
    A["Linux の変数タイプ"] --> B["シェル変数"]
    A --> C["環境変数"]
    A --> D["永続的な変数"]

    B --> B1["セッションのみ"]
    B --> B2["継承されない"]
    B --> B3["終了時に消失"]

    C --> C1["セッションスコープ"]
    C --> C2["子プロセスからアクセス可"]
    C --> C3["終了時に消失"]

    D --> D1["すべてのセッション"]
    D --> D2["子プロセスからアクセス可"]
    D --> D3["永続的"]

    B1 --> E1["my_var='value'"]
    C2 --> E2["export VAR='value'"]
    D3 --> E3["~/.zshrc ファイル"]

    style B fill:#ffebee
    style C fill:#fff3e0
    style D fill:#e8f5e8

この図は、変数の永続性における 3 つのレベルを示しています。クイックリファレンス用のまとめ表は以下の通りです。

変数タイプ スコープ 子プロセスからのアクセス 永続性 構文例
シェル変数 現在のセッションのみ 不可 終了時に消失 my_var='value'
環境変数 現在のセッション 可能 終了時に消失 export VAR='value'
永続的な変数 すべての新しいセッション 可能 終了後も保持 ~/.zshrc ファイル内

これら 3 つのレベルを理解することは、効果的な Linux システム管理において極めて重要であり、状況に応じて適切なアプローチを選択するのに役立ちます。

PATH 環境変数の変更

PATH 変数は、Linux において最も重要な環境変数のひとつです。これは、実行ファイルを探す場所をシステムに伝えます。新しいディレクトリを含めるようにこれを変更してみましょう。

  1. まず、カスタムスクリプトを保存するための新しいディレクトリを作成します。

    mkdir ~/my_scripts
    

    これにより、ホームディレクトリに my_scripts というディレクトリが作成されます。~ 記号はホームディレクトリのパス(この実験では /home/labex)のショートカットです。

  2. 次に、この新しいディレクトリを PATH に追加します。export コマンドを使用しますが、今回は既存の変数を修正します。

    export PATH="$PATH:$HOME/my_scripts"
    

    このコマンドの内容を分解してみましょう。

    • $PATH は、現在の PATH 環境変数の値です。既存の値を利用して、そこに付け加えています。
    • : は、PATH 内のディレクトリを区切るために使用されます。コロンを忘れると、シェルは追加したディレクトリ内の実行ファイルを見つけることができません。
    • $HOME は、ホームディレクトリ(今回の場合は /home/labex)を指す環境変数です。
    • つまり、既存の PATH の末尾に :$HOME/my_scripts を追加しています。これにより、システムは元の PATH にあるディレクトリを検索したに、my_scripts 内の実行ファイルを探すようになります。
  3. 新しいディレクトリが追加されたことを確認します。

    echo $PATH
    

    出力の最後に /home/labex/my_scripts が表示されるはずです。もし最後になくても、パスの中に含まれていれば問題ありません。

  4. これをテストするために、新しいディレクトリに簡単なスクリプトを作成します。

    cat << 'EOF' > ~/my_scripts/hello.sh
    #!/bin/zsh
    echo "Hello from my custom script!"
    EOF
    

    これにより、~/my_scripts ディレクトリに hello.sh というシェルスクリプトが作成されます。最初の行の #!/bin/zsh は、これが zsh スクリプトであることをシステムに伝え、プログラムとして実行できるようにします。

  5. スクリプトを実行可能にします。

    chmod +x ~/my_scripts/hello.sh
    

    chmod +x コマンドはスクリプトに実行権限を付与します。このステップを行わないと、実行しようとしたときに「許可がありません(permission denied)」というエラーが発生します。

  6. これで、名前を入力するだけでどこからでもこのスクリプトを実行できるようになります。

    hello.sh
    

    すべてが正しく設定されていれば、Hello from my custom script! と表示されます。

これが機能するのは、my_scripts ディレクトリを PATH に追加したからです。コマンドを入力すると、シェルは PATH にリストされている各ディレクトリを順番に調べ、その名前の実行ファイルを探します。my_scriptsPATH に追加したことで、シェルにそこも探すように指示したことになります。

これを証明するために、別のディレクトリに移動して再度スクリプトを実行してみてください。

cd /tmp
hello.sh

スクリプトが置かれているディレクトリにいなくても、スクリプトが実行されることがわかります。これが PATH 変数の力です。PATH にリストされているディレクトリにさえあれば、システムのどこからでも実行ファイルを呼び出すことができます。

素晴らしい!PATH 環境変数を正常に変更し、どこからでも実行できるカスタムスクリプトを作成できました。

環境変数の永続化

設定した環境変数は、ターミナルを閉じると失われてしまいます。これらを永続的に(次回以降も有効に)するには、シェルの設定ファイルに追加する必要があります。使用するファイルは、利用しているシェルによって異なります。

この実験環境では、Bourne Shell (sh) の拡張版である Z shell (zsh) を使用しています。Zsh は Bash、ksh、tcsh の多くの機能を備えており、現在では macOS のデフォルトシェルになるなど非常に人気があります。

もし Bash(多くの Linux ディストリビューションのデフォルト)を使用している場合は .bashrc を編集しますが、ここでは Zsh を使用しているため、.zshrc を編集します。正しいファイルを編集することが非常に重要です。zsh を使っているのに .bashrc を編集しても、変数は反映されません。

  1. ホームディレクトリにある .zshrc ファイルをテキストエディタで開きます。ここでは、シンプルで使いやすい nano エディタを使用します。

    nano ~/.zshrc
    

    このコマンドは ~/.zshrc ファイルを開きます。.zshrc ファイルが存在しない場合、nano は新しいファイルを作成します。このファイルは、新しいターミナルセッションを開始するたびに実行されます。

  2. ファイルの末尾までスクロールし(矢印キーを使用)、次の行を追加します。

    export MY_ENV_VAR="This is an environment variable"
    export PATH="$PATH:$HOME/my_scripts"
    

    必ずファイルの最後に追加してください。スペルや構文、特に = の前後にスペースがないことを確認してください。

  3. ファイルを保存してエディタを終了します。nano の場合は、Ctrl+X を押し、次に Y(保存の確認)、最後に Enter を押します。

  4. ターミナルを再起動せずにこれらの変更を適用するには、source コマンドを使用します。

    source ~/.zshrc
    

    source コマンドは、指定されたファイル内のコマンドを現在のシェル環境で読み込んで実行します。これは bash ~/.zshrc のように実行するのとは異なります。単に実行した場合は新しいシェルで動くだけで現在のシェルには影響しませんが、source現在のシェルで実行するため、変更が即座に反映されます。このステップをスキップすると、現在のターミナルには変更が反映されず、一度閉じてから再度開く必要があります。

これで、新しいターミナルを開くたびにこれらの環境変数が自動的に設定されるようになります。これは、開発環境を常に一定の状態に保つのに非常に便利です。

重要な環境変数の理解

Linux には、システムの動作に不可欠なあらかじめ定義された環境変数がいくつかあります。それらを確認してみましょう。

  1. HOME: 現在のユーザーのホームディレクトリを指します。

    echo $HOME
    
  2. USER: 現在のユーザーのユーザー名が含まれます。

    echo $USER
    
  3. SHELL: ユーザーのデフォルトシェルを指定します。

    echo $SHELL
    
  4. PWD: "Print Working Directory" の略です。現在のディレクトリのパスが含まれます。

    echo $PWD
    
  5. TERM: シェルを実行する際にエミュレートするターミナルの種類を指定します。

    echo $TERM
    

これらの変数を理解することで、Linux 環境のナビゲーションや制御がよりスムーズになります。

環境変数の解除

環境変数を削除する必要がある場合もあります。その場合は unset コマンドを使用します。

  1. まず、MY_ENV_VAR がまだ設定されているか確認します。

    echo $MY_ENV_VAR
    

    先ほど設定した値が表示されるはずです。

  2. この変数を解除(削除)するには、unset コマンドを使用します。

    unset MY_ENV_VAR
    
  3. 変数が解除されたことを確認します。

    echo $MY_ENV_VAR
    

    何も出力されなければ、変数が存在しなくなったことを意味します。

  4. シェル関数ではなく確実に変数を解除するために、unset-v オプションを付けることもできます。

    unset -v MY_ENV_VAR
    

    これは単に unset MY_ENV_VAR を実行するのと同じ結果になります。

注意点として、.zshrc ファイルに変数を追加している場合、次にターミナルを開くか .zshrcsource したときに、その変数は再び作成されます。

まとめ

おめでとうございます!Linux の環境変数に関する包括的な実験を完了しました。学んだ内容を振り返ってみましょう。

  1. シンプルなシェル変数を作成してアクセスし、そのスコープを理解しました。
  2. 環境変数について学び、シェル変数との違い(特に子プロセスへの継承)や、export コマンドがその鍵であることを理解しました。
  3. 重要な PATH 変数を変更してカスタムディレクトリを追加し、システムのどこからでもスクリプトを実行できるようにしました。また、区切り文字としてのコロン : の重要性を学びました。
  4. .zshrc に変数を追加することで環境変数を永続化しました。Bash と Zsh の設定ファイルの違いや、変更を適用するための source コマンドの意義を理解しました。
  5. Linux に組み込まれている主要な環境変数をいくつか確認しました。
  6. 最後に、unset コマンドを使用して環境変数を削除する方法を学びました。

これらのスキルは、Linux のシステム管理やソフトウェア開発の基礎となるものです。環境変数を使用すると、システムやアプリケーションを柔軟に構成できます。Linux での作業を続ける中で、スクリプト作成、開発、システム設定など、環境変数の無数の活用場面に出会うことでしょう。

習得の近道は練習です。さまざまな目的で独自の環境変数を作成し、アプリケーションやスクリプトが環境変数を使用してどのように動作を制御しているかを探求してみてください。ハッピーラーニング!