Bashの環境変数とは?基本の仕組みと設定方法をわかりやすく解説
コンピュータの世界で「変数」とは、変更されうる値の代わりとなる名前のことです。実は私たちは、日常会話の中でも意識せずに変数を使っています。たとえば「私の車」と言うとき、「私の車」はその時点で自分が所有している車を指す一種の変数のようなものです。古い車を新しい車に買い替えればメーカーやモデルは変わりますが、「私の車」という呼び方を決めておけば、車に言及するたびに現在の車種をいちいち説明する必要がなくなります。
コンピュータ上でも、変数は同じような目的で使われます。
たとえば、コンピュータにユーザーアカウントを持つ人には、個人データが保存されるホームディレクトリがあります。しかし、ホームディレクトリはユーザーごとに異なります(Sethなら/home/seth、Tuxなら/home/tuxという具合です)。そこで、ホームディレクトリを汎用的に参照したい場合には、変数$HOMEを使うことで、ログイン名に関係なく「現在の」ユーザーのホームディレクトリを示すことができます。
環境変数とは、$HOMEのようにログインセッションに関する情報を格納する特別な変数です。これらはシステムシェルがコマンドを実行する際に利用できるよう保存されており、Linux、Mac、Windowsのどれを使っていても存在します。多くの環境変数は、インストール時やユーザー作成時にデフォルトで設定されます。
環境変数はすべてのモダンなシステムに共通して存在しますが、この記事では特にLinux、BSD、Mac、CygwinにおけるBashシェルの環境変数について取り上げます。
環境変数を理解する
技術的には、環境変数は普通の変数と何ら変わりません。変数とまったく同じ構文で、設定・参照・削除ができます。Bashでの変数の扱いに慣れていない方は、先に「Bashの変数」に関する記事を読んでおくことをおすすめします。
環境変数を直接使う機会はそれほど多くありません。多くの場合、個々のアプリケーションやデーモンが必要に応じて参照します。たとえば、ホームディレクトリはログイン時に環境変数として設定されます。Linuxでは、次のようにHOME環境変数の中身を確認できます。
$ echo $HOME
HOME=/home/seth
Macの場合:
$ echo $HOME
HOME=/Users/bogus
Windowsの場合:
C:\Users\bogus
システムに設定されているすべての環境変数は、envコマンドで一覧できます。リストは長くなるので、出力をmoreにパイプして読みやすくするとよいでしょう。
$ env | more
TERM=xterm-256color
LESSOPEN=||/usr/bin/lesspipe.sh %s
USER=seth
SUDO_EDITOR=emacs
WWW_HOME=https://mirror.lagoon.nc/pub/slackware/slackware64-current/ChangeLog.txt
VISUAL=emacs
DISPLAY=:0
PS1=$
XDG_DATA_DIRS=/home/seth/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin
GDMSESSION=gnome
MAIL=/var/spool/mail/seth
[...]
環境変数は、デフォルト設定を上書きしたいときや、システムが自動的には作成しない新しい設定を管理したいときに役立ちます。たとえば、コマンドを入力したときに、コンピュータがそのコマンドに対応するアプリケーションを「見つけられる」のは、PATH環境変数がどこを探せばよいかを教えているからです。この変数には、OSがコマンドを検索すべき有効なディレクトリの一覧が記録されており、lsやcpといった基本コマンドから、FirefoxやLutrisのようなグラフィカルアプリケーションまで、あらゆるものが対象になります。
環境変数は、システムごとに異なる用途で使われます。たとえばPATH変数はターミナルエミュレータにとって不可欠ですが、Javaにとってはそれほど重要ではありません(Javaには重要なライブラリを指す独自のパスがあります)。一方、USER変数は複数のシステムで、サービスを要求しているのが誰かを識別するために使われます。たとえばマルチユーザーシステムでローカルのメールボックスを確認する場合、mailコマンドはMAIL変数とUSER変数に基づいて、どのメールスプールを取得すべきかを判断します。
環境変数を設定する
通常、新しいアプリケーションのインストーラー(Fedoraのdnf、Ubuntuのapt、Macのbrew、あるいはカスタムインストーラーなど)が、環境変数を自動的に更新してくれます。しかし、ディストリビューション標準のツールセット以外のものをインストールする場合は、自分で環境変数を管理しなければならないこともあります。あるいは、自分の好みに合わせて環境変数を追加することもあるでしょう。たとえば、一部のアプリケーションをホームディレクトリ内のbinフォルダに置きたいと決めたなら、そのディレクトリをPATHに追加する必要があります。そうすることで、コマンド実行時にOSがそこも探してくれるようになります。
一時的な環境変数
使い捨ての変数を作るときと同じ方法で、パスに場所を追加できます。これは機能しますが、システムパスを変更したシェルが開いている間しか有効ではありません。たとえば、Bashシェルを開いてシステムパスを変更してみます。
$ export PATH=$PATH:/home/seth/bin
結果を確認します。
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin:/home/seth/bin
セッションを閉じます。
$ exit
新しいセッションを開いて、PATH変数を見てみます。
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin
変数はデフォルトの状態に戻ってしまいました。これは、新しいシェルを起動するたびにPATHが設定されるわけではないからです。永続化するには、シェルが起動されるたびに変数が読み込まれるよう設定する必要があります。
永続的な環境変数
独自の永続的な環境変数は、シェルの設定ファイルに記述できます。最も一般的なのは~/.bashrcです。複数のユーザーを管理するシステム管理者であれば、/etc/profile.dディレクトリに配置したスクリプトで環境変数を設定することもできます。
設定ファイルで変数を指定する構文は、シェルで変数を設定するときと同じです。
export PATH=$PATH:/snap/bin:/home/seth/bin
現在のシェルを閉じるか、更新された設定を強制的に読み込みます。
$ . ~/.bashrc
最後に、もう一度システムパスを確認します。
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin:/home/seth/bin
これで、追加したカスタムディレクトリが正しく含まれるようになりました。
その他の環境変数を調べる
環境変数は自由に作成・操作でき、実際にそうしているアプリケーションもあります。つまり、あなたの環境変数の多くはほとんどのアプリケーションから使われておらず、自分で勝手に追加した変数の中には、まったく使われないものもありえます。そこで問題になるのは、「どの環境変数が意味を持つのか、どうやって見分けるのか」という点です。
答えはアプリケーションのドキュメントにあります。たとえば、Bash環境全般でどんなオプションが使えるのかを知りたいなら、Bashのドキュメントを読みましょう。Bashのmanページにも重要な変数が多数記載されていますが、GNU infoページのBashには、便利なBourne ShellおよびBashの環境変数とそれぞれの使い方を網羅した2つのリストが掲載されています。
たとえば、infoページのリストには次のような項目があります。
'HISTCONTROL'
A colon-separated list of values controlling how commands are saved
on the history list. If the list of values includes 'ignorespace',
lines which begin with a space character are not saved in the
history list. A value of 'ignoredups' causes lines which match the
previous history entry to not be saved. A value of 'ignoreboth' is
shorthand for 'ignorespace' and 'ignoredups'.
[...]
この記述からわかるのは、HISTCONTROL環境変数がBashの履歴の保存方法を制御しており、いくつかの値で挙動をカスタマイズできるということです。この例では、ignoredupsという値を指定すると、historyコマンドの出力で直前のエントリと重複する行が無視されます。
これは簡単に試せます。まず、同じコマンドを続けて2回実行します。
$ echo "hello world"
hello world
$ echo "hello world"
hello world
履歴の最近のエントリを表示してみましょう。
$ history | tail -5
996 man bash
997 info bash
998 echo "hello world"
999 echo "hello world"
1000 history
重複したエントリがそのまま並んで記録されていることがわかります。
infoページで読んだ内容をもとに、.bashrcファイルに新しい環境変数を設定します。
export HISTCONTROL=$HISTCONTROL:ignorespace:ignoredups
保存して、新しい設定を読み込みます。
$ source ~/.bashrc
再び、同じコマンドを続けて2回実行します。
$ echo "hello once"
hello once
$ echo "hello once"
hello once
履歴の最新エントリを表示します。
$ history | tail -5
1000 history
1001 emacs ~/.bashrc
1002 source ~/.bashrc
1003 echo "hello once"
1004 history
新しい環境変数のおかげで、重複エントリが1つにまとめられました。infoページに書かれている通りの動作です。
関連する環境変数を見つけるには、通常、影響を与えたいアプリケーションのドキュメントを読むのが一番の近道です。ほとんどの環境変数は、特定のアプリケーションがスムーズに動作するために必要なものです。汎用的な項目については、シェルのドキュメントを調べるのが理にかなっています。また、新しい環境変数を必要とするスクリプトやアプリケーションを自作する場合は、必ず自分のドキュメントでその変数を定義しておきましょう。
-
Bash変数とは?基本の仕組みと実践的な使い方を徹底解説
Bashでは、長い文字列をひとつの変数に割り当てることができます。これにより、コマンドの入力やスクリプト作成が格段にシンプルになります。本記事では、Bash変数の仕組みと、実際の活用方法について詳しく解説します。 変数とは何か? 変数とは、さまざまな英数字の値を格納できる「覚えやすい名前」のことです。変数を使う最大のメリットは、同じ関数や処理を異なる値に対して適用できる点にあります。スクリプトやコードを書き直す必要がなくなるため、作業効率が大きく向上します。また、個別の値を扱う代わりに共通の名前を使えるため、コードそのものも読みやすく、書きやすくなります。 リアルタイムで使える一時変数
-
環境変数を守る:APIキーやシークレットのためのセキュリティ対策ガイド
前回の記事「The Rubyists Guide To Environment Variables」では、環境変数システムの仕組みと、よくある誤解について解説しました。しかし、ある読者から「セキュリティについての言及が少ない」とのご指摘をいただきました。 現在では、秘密のAPIキーなどの重要な情報を環境変数に保存するのが一般的になっています。だからこそ、環境変数が持つセキュリティ上のリスクを正しく理解することが重要です。今回はそのポイントを見ていきましょう。 最悪のシナリオ ハッカーがroot権限、あるいはWebアプリケーションの所有ユーザーとしてサーバーへのアクセスに成功したと想像してくださ