
開発者の皆さん、環境変数に悩んでいませんか?
「あれ?このコマンド、なんで動かないんだ?」「先輩の環境では動くのに、僕のPCだとエラーが出る…」
開発者なら一度は経験する、そんなモヤモヤの原因の一つに「環境変数」があります。普段何気なく使っているけれど、その仕組みや重要性、そしてOSごとの違いまで、きちんと理解している人は意外と少ないかもしれません。
しかし、環境変数をマスターすることは、開発効率の向上、トラブルシューティングの時間短縮の強力な武器になります。特にmacOSとUbuntu、異なるOSを使いこなす開発者にとって、両OSでの環境変数の扱いの共通点と違いを理解することは必須スキルと言えるでしょう。
この記事では、環境変数の「なぜ必要か」から「どう使うか」まで、初心者の方にも分かりやすく、そして実践的に解説していきます。さあ、一緒に環境変数マスターへの第一歩を踏み出しましょう!
対象読者
- システム開発に関わり始めて1年未満のジュニアレベルのエンジニア
- 「環境変数」という言葉は聞いたことがあるが、その役割や設定方法がよく分からない方
- macOSまたはUbuntu環境で開発を行っており、環境変数で「なぜか動かない」といった問題に直面した経験がある方
- 開発効率を向上させ、トラブルシューティングの時間を短縮したいと考えている方
目次
- 環境変数とは何か?
- 具体例と利用シーン
- OSとアプリケーションの橋渡し役
- なぜ環境変数が必要なのか?(設定の分離、機密情報の管理など)
- 環境変数の種類とスコープ
- スコープの概念:影響範囲と持続性
- システム全体 vs ユーザー固有
- セッション変数 vs 永続変数
- 図解:環境変数のスコープと持続性の関係
- macOSとUbuntuにおける環境変数の共通点と違い(概要)
- まとめと次回予告
動作検証環境
この記事は、以下の環境で検証しています。
- OS : macOS Tahoe Version 26.0
- ハードウェア : MacBook Air 2024 M3 24GB
- Multipass : Multipass version 1.16.1
- Ubuntu : 24.0.4.0.2
環境変数とは何か?
環境変数とは、OSやアプリケーションが動作する上で参照する「設定値」を格納するための特別な変数です。
例えば、プログラムが特定のファイルを探すパスや、データベースへの接続情報、APIキーなどが環境変数として設定されることがあります。
具体例と利用シーン
環境変数は、私たちの開発作業の様々な場面で活躍しています。いくつか具体的な例を見てみましょう。
- コマンドの実行パス (
PATH
):- あなたがターミナルで
ls
やpython
といったコマンドを入力したとき、OSはどこからそのプログラムを探してくるのでしょうか? 実は、PATH
という環境変数に登録されたディレクトリの中から順番に探しています。もしPATH
に登録されていない場所にインストールされたプログラムを実行しようとすると、「command not found」といったエラーが表示されます。
- あなたがターミナルで
- APIキーやデータベース接続情報:
- Webアプリケーションを開発する際、外部サービスのAPIキーやデータベースのユーザー名・パスワードといった機密情報をコードに直接書き込むのは非常に危険です。環境変数として設定しておけば、コードを公開しても機密情報が漏洩するリスクを減らせます。
- 開発環境の切り替え:
- 同じアプリケーションでも、開発中はテスト用のデータベースに接続し、本番環境では実際のデータベースに接続するといった使い分けが必要です。
NODE_ENV
やRAILS_ENV
のような環境変数を使って「今、どの環境で動いているか」をアプリケーションに伝えれば、コードを変更することなく設定を切り替えることができます。
- 同じアプリケーションでも、開発中はテスト用のデータベースに接続し、本番環境では実際のデータベースに接続するといった使い分けが必要です。
- 言語設定 (
LANG
):- ターミナルやアプリケーションの表示言語も環境変数で制御されることがあります。例えば、
LANG=ja_JP.UTF-8
と設定されていれば日本語で表示され、LANG=en_US.UTF-8
であれば英語で表示されます。
- ターミナルやアプリケーションの表示言語も環境変数で制御されることがあります。例えば、
このように、環境変数はアプリケーションの動作を柔軟に制御し、セキュリティや移植性を高める上で不可欠な存在なのです。
OSとアプリケーションの橋渡し役
環境変数は、OSとアプリケーションの間で情報をやり取りするための「共通言語」のようなものです。アプリケーションは、起動時にOSから環境変数の情報を受け取り、その値に基づいて動作を調整します。これにより、アプリケーションのコード自体を変更することなく、実行環境に合わせて柔軟に動作を変えることができます。
環境変数の役割:設定の「伝言役」
環境変数の最も重要な役割は、OSが管理する様々な設定情報を、アプリケーションに「伝言」することです。アプリケーションは、起動時にこの「伝言」を受け取り、その内容に応じて動作を変えます。
例えば、あなたが書いたプログラムが特定のデータベースに接続する必要があるとします。このとき、データベースの接続先(URL)や認証情報(ユーザー名、パスワード)をプログラムのコードの中に直接書き込んでしまうと、以下のような問題が発生します。
- 環境ごとの変更が面倒: 開発環境、テスト環境、本番環境でデータベースが異なる場合、環境ごとにコードを書き換える必要があります。
- 機密情報の漏洩リスク: データベースのパスワードがコードに含まれていると、コードが公開された場合に情報が漏洩する危険性があります。
ここで環境変数が「伝言役」として機能します。OSが環境変数としてデータベースの接続情報を保持し、アプリケーションは起動時にその環境変数を読み込むことで、コードを変更することなく、どのデータベースに接続すべきかを知ることができます。
柔軟性の源泉:コードと設定の分離
この「伝言役」としての役割が、アプリケーションに大きな柔軟性をもたらします。
- コードの再利用性向上: アプリケーションのコードは、特定の環境設定に依存しない「汎用的な処理」として書くことができます。これにより、同じコードを様々な環境で再利用できるようになります。
- デプロイの簡素化: 環境ごとにコードを修正して再ビルド・再デプロイする必要がなくなります。環境変数を変更するだけで、アプリケーションの動作を切り替えられるため、デプロイ作業が大幅に簡素化されます。
- セキュリティの強化: 機密情報をコードから分離し、OSの管理下で安全に扱うことができます。
このように、環境変数はアプリケーションの「設定」と「ロジック」を明確に分離することで、開発・運用をより効率的かつ安全にするための基盤を提供しているのです。
図解:OSとアプリケーション、環境変数の関係

なぜ環境変数が必要なのか?(設定の分離、機密情報の管理など)
環境変数がなぜ重要なのか、具体的なメリットを見ていきましょう。
- 設定の分離:
- 開発環境、テスト環境、本番環境など、環境ごとに異なる設定(データベースのURL、APIエンドポイントなど)を持つことはよくあります。環境変数を使えば、これらの設定をコードから分離し、環境ごとに異なる値を簡単に切り替えることができます。これにより、コードの再コンパイルやデプロイなしに、環境に合わせた設定を適用できます。
- 機密情報の管理:
- APIキー、データベースのパスワード、認証トークンなどの機密情報をコード内に直接記述することは、セキュリティ上の大きなリスクです。環境変数として設定することで、これらの機密情報をコードから分離し、バージョン管理システムに誤ってコミットされることを防ぎます。また、本番環境では環境変数として安全に管理することで、情報漏洩のリスクを低減できます。
- 移植性の向上:
- 環境変数を使用することで、アプリケーションは特定のパスや設定に依存しなくなります。これにより、異なるOSやサーバー環境にアプリケーションを移植する際の手間が大幅に削減されます。
環境変数の種類とスコープ
環境変数には、その有効範囲(スコープ)によっていくつかの種類があります。このスコープを理解することは、環境変数が「いつ」「どこで」「誰に」影響を与えるのかを把握するために非常に重要です。
スコープの概念:影響範囲と持続性
環境変数のスコープは、大きく分けて「影響範囲(システム全体か、特定のユーザーか)」と「持続性(一時的か、永続的か)」の2つの軸で考えることができます。
システム全体 vs ユーザー固有
これは、環境変数がOS上の「誰」に影響を与えるか、という視点です。
- システム全体:
- 影響範囲: OSにログインするすべてのユーザー、およびシステムサービス(OSの起動時に自動的に実行されるプログラムなど)で利用可能な環境変数です。OS全体の設定や、すべてのユーザーに共通で利用させたいプログラムのパスなどに使われます。
- 具体例:
PATH
(多くのシステムコマンドのパス),LANG
(システムのデフォルト言語設定) など。 - 設定ファイル例: Ubuntuでは
/etc/environment
や/etc/profile
など。macOSではより複雑な仕組み(launchd
など)が関わります。
- ユーザー固有:
- 影響範囲: 特定のユーザーがログインしたときにのみ設定され、そのユーザーのセッション内でのみ有効な環境変数です。個人の開発環境設定や、特定のユーザーだけが利用するツールへのパスなどに使われます。
- 具体例:
HOME
(ユーザーのホームディレクトリ),USER
(現在のユーザー名) など。 - 設定ファイル例:
~/.bashrc
,~/.zshrc
,~/.profile
など、ユーザーのホームディレクトリにあるシェル設定ファイル。
セッション変数 vs 永続変数
これは、環境変数が「いつまで」有効か、という持続性の視点です。
- セッション変数(一時的):
- 持続性: 現在開いているターミナルセッションや、そこから起動されたプロセス内でのみ有効な環境変数です。ターミナルを閉じたり、プロセスが終了するとその値は消滅します。
- 設定方法: ターミナルで
export MY_VAR="value"
のようにexport
コマンドを使って設定します。 - 利用シーン: 一時的なテスト、スクリプト内でのみ利用する変数、機密性の高い一時的な情報など。
- 永続変数:
- 持続性: OSの再起動後も、または新しいターミナルセッションを開いた後も保持される環境変数です。システム全体やユーザー固有の設定ファイルに記述することで永続化されます。
- 設定方法: 前述の
/etc/environment
や~/.bashrc
などの設定ファイルにMY_VAR="value"
のように記述します。 - 利用シーン: 常に利用するプログラムのパス、永続的なAPIキー、デフォルトの言語設定など。
図解:環境変数のスコープと持続性の関係

macOSとUbuntuにおける環境変数の共通点と違い(概要)
macOSとUbuntuは、どちらもUnix系のOSですが、環境変数の設定方法や管理方法にはいくつかの共通点と違いがあります。
共通点:
export
コマンドによる一時的な設定- ユーザーのホームディレクトリにあるシェル設定ファイル(例:
.bashrc
,.zshrc
)による永続化
違い:
- システム全体の永続化: Ubuntuでは
/etc/environment
や/etc/profile
などがよく使われますが、macOSではlaunchd
という仕組みがGUIアプリケーションの環境変数に影響を与えるなど、より複雑な側面があります。 - GUIアプリケーションへの影響: macOSでは、ターミナルで設定した環境変数がGUIアプリケーションに直接引き継がれない場合があります。これはmacOSの起動プロセスと環境変数の読み込み順序に起因します。
これらの違いについては、今後の記事で詳しく掘り下げていきます。
まとめと次回予告
今回は、環境変数の基本的な概念、なぜ開発において重要なのか、そしてその種類とスコープについて解説しました。macOSとUbuntuという異なるOSでの開発において、環境変数の理解がいかに重要であるかを感じていただけたでしょうか。
次回は、【macOS編】として、macOS環境での環境変数の設定、永続化、そしてGUIアプリケーションとの連携について、さらに深く掘り下げていきます。お楽しみに!
免責事項
本記事は、環境変数に関する一般的な情報提供を目的としています。記載されている情報は、執筆時点での正確性を期しておりますが、OSのバージョンアップや環境の変化により、内容が古くなったり、異なる挙動を示す可能性があります。本記事の内容を実践される際は、ご自身の責任において十分な検証を行い、必要に応じて公式ドキュメント等をご確認ください。本記事の情報を利用したことによって生じた、いかなる損害についても、当方は一切の責任を負いかねますので、あらかじめご了承ください。