PowerShellの環境変数とは?基本知識から設定・確認方法まで徹底解説
環境変数は、Linux、Mac、Windowsといったコンピューター全体で共有されるグローバルな設定値であり、システムシェルがコマンドを実行する際に参照するために保存されています。多くの環境変数は、OSのインストール時やユーザーアカウントの作成時に自動的に設定されます。
たとえば、ホームディレクトリはログイン時に環境変数として登録されます。PowerShellでの表示内容は、使用しているOSによって異なります。
OSごとのHOME変数の確認例
Windowsの場合:
PS C:\Users\bogus> Get-Variable HOME -valueOnly
C:\Users\bogus
Linuxの場合:
pwsh> Get-Variable HOME -valueOnly
HOME=/home/seth
Macの場合:
pwsh> Get-Variable HOME -valueOnly
HOME=/Users/bogus
環境変数を直接操作することはあまりありませんが、個々のアプリケーションやデーモンが必要に応じて参照しています。ただし、デフォルト設定を上書きしたい場合や、システムが自動的には作成しない新しい設定を管理したい場合には、環境変数が非常に役立ちます。
本記事では、オープンソースのPowerShell環境における環境変数について解説します。そのため、Windows、Linux、Macのいずれかで動作するPowerShellに共通して適用できる内容です。Bashシェルをご利用の方は、Bashの環境変数に関する記事を参考にしてください。
なお、本記事の執筆時にはオープンソースOSであるLinux上でPowerShellを実行しています。コマンド自体はプラットフォームに関係なく同じですが、出力結果は環境によって異なります(たとえば、あなたのユーザー名がsethである可能性は統計的にほぼないでしょう)。
環境変数とは何か?
PowerShellにおける環境変数とは、オペレーティングシステムの環境に関する情報をシステムに提供する特殊な種類の変数です。環境変数を使うことで、Windowsレジストリ内の変数や、特定のセッションに対して設定された変数を表示・変更できます。
PowerShellでは、環境変数はEnv:という「ドライブ」に格納されており、PowerShellのサブシステムであるPowerShell環境プロバイダーを通じてアクセスできます。これは物理的なドライブではなく、仮想的なファイルシステムです。
環境変数はEnv:ドライブに存在するため、参照する際には変数名の前にEnv:を付ける必要があります。あるいは、Set-Locationコマンドで作業場所をEnv:ドライブに変更すれば、すべての環境変数をローカル変数のように扱うことも可能です。
PS> Set-Location Env:
PS> pwd
Path
----
Env:/
環境変数は、ログインセッションに関する情報をコンピューターに伝える役割を担っています。たとえば、アプリケーションがデータファイルのデフォルトの保存先を判断する必要があるとき、通常はHOME環境変数を参照します。HOME変数を自分で設定した覚えはないでしょうが、それでも存在しています。これは、ほとんどの環境変数がオペレーティングシステムによって管理されているためです。
システム上のすべての環境変数を一覧表示する
Env:ドライブ内でGet-ChildItemコマンドを実行すると、システムに設定されているすべての環境変数を確認できます。リストは長くなるため、out-host -pagingにパイプして出力すると読みやすくなります。
PS> Get-ChildItem | out-host -paging
LOGNAME seth
LS_COLORS rs=0:mh=00:bd=48;5;232;38;5;
MAIL /var/spool/mail/seth
MODULEPATH /etc/scl/modulefiles:/etc/scl/modulefiles
MODULESHOME /usr/share/Modules
OLDPWD /home/seth
PATH /opt/microsoft/powershell/6:/usr/share/Modules/bin
PSModulePath /home/seth/.local/share/powershell/Modules
PWD /home/seth
[...]
Env:ドライブにいない場合でも、コマンドにEnv:を追加すれば同じことができます。
PS> Get-ChildItem Env: | out-host -paging
LOGNAME seth
LS_COLORS rs=0:mh=00:bd=48;5;232;38;5;
MAIL /var/spool/mail/seth
MODULEPATH /etc/scl/modulefiles:/etc/scl/modulefiles
環境変数は、通常の変数とほぼ同じ構文で設定・取得・削除できます。他の変数と同様に、セッション中に設定した内容はそのセッションにのみ適用されます。
変数を永続的に変更したい場合は、WindowsではWindowsレジストリを、LinuxやMacではシェルの設定ファイル(~/.bashrcなど)を編集する必要があります。PowerShellでの変数の扱いに慣れていない方は、先に「PowerShellの変数」に関する記事を読んでおくことをおすすめします。
環境変数は何に使われるのか?
さまざまな環境変数は、コンピューター内の複数の異なるシステムによって利用されます。たとえばPATH変数はシェルにとって不可欠ですが、Javaにとってはそれほど重要ではありません(Javaにもパスはありますが、それは一般的なシステムフォルダではなく、重要なJavaライブラリへのパスです)。一方、USER変数は、誰がサービスを要求しているのかを識別するために、複数の異なるプロセスから利用されます。
オープンソースのNullsoft Scriptable Install System(NSIS)フレームワークのようなインストーラーウィザードは、新しいアプリケーションのインストール時に環境変数を更新します。しかし、OS標準のツールセット以外のものをインストールする場合は、自分で環境変数を管理しなければならないこともあります。あるいは、自分の好みに合わせて環境変数を追加することもあるでしょう。
通常の変数との違いは?
通常の変数を作成すると、その変数はローカルとして扱われます。つまり、作成したシェルの外側では定義されません。
たとえば、次のように変数を作成します。
PS> Set-Variable -Name VAR -Value "example"
PS> gv VAR -valueOnly
example
その後、現在のシェルの中からでも新しいシェルを起動してみましょう。
PS> pwsh
PS c:\> gv VAR -valueOnly
gv : Cannot find a variable with the name 'example'.
このように、通常の変数は新しいシェルからは見えません。一方、環境変数はグローバルなスコープを持つことを目的としています。作成元のシェルとは独立して存在し、他のプロセスからも利用できます。
環境変数を設定するには?
環境変数を設定する際は、$Env:という記法を使って、それが環境変数であることを明示しましょう。
PS Env:/> $Env:FOO = "hello world"
PS Env:/> Get-ChildItem FOO
hello world
テストとして、新しいセッションを起動し、今作成した変数にアクセスしてみます。環境変数なので、$Env:を前置する必要があります。
PS Env:/> pwsh
PS c:\> $Env.FOO
hello world
これで変数は子プロセスからも利用可能になりましたが、それでも一時的な変数であることに変わりはありません。動作することを確認でき、どのプロセスからでも使えますが、作成元のシェルを閉じると破棄されます。
プロファイルで環境変数を永続化するには?
環境変数をセッションをまたいで永続化させたい場合は、PowerShellのプロファイルに追加する必要があります。たとえば、HOME/Documents/Profile.ps1にあるCurrentUser,AllHostsプロファイルに追記します。
PS> Add-Content -Path $Profile.CurrentUserAllHosts -Value '$Env:FOO = "hello world"'
この1行を追加しておけば、以降に起動されるすべてのPowerShellセッションで、FOO環境変数がインスタンス化され、値としてhello worldが設定されます。
現在、PowerShellセッションを制御するデフォルトのプロファイルは6種類あります。詳細については、Microsoftの開発者ブログを参照してください。
新しい環境変数を見つけるには?
環境変数は自由に作成・操作できますし、実際にそうしているアプリケーションもあります。このことは、あなたの環境変数の多くがほとんどのアプリケーションから使われておらず、自分で追加した任意の変数の中には、まったく使われないものもあり得るということです。
そこで問題になるのは、「どの環境変数が意味を持つのか、どうやって見分けるのか」という点です。答えは、アプリケーションのドキュメントにあります。
たとえばPythonは、インストール時に適切なPythonのパスをPath環境変数に追加するかどうかを選択できます。追加を辞退した場合でも、環境変数の変更方法をすでに理解していれば、後から自分で値を設定できます。
インストールするあらゆるアプリケーションにも同じことが言えます。インストーラーは適切な変数を環境に追加するのが本来の役割なので、Env:を手動で修正する必要は基本的にありません。もしアプリケーションを開発しているなら、あなたのインストーラーもユーザーのために同じことをすべきです。
個々のアプリケーションにとって重要な変数を把握するには、それぞれのユーザードキュメントや開発者向けドキュメントを参照してください。
-
Rubyで環境変数を使う方法|ENVオブジェクトの操作から設定・Rails credentialsまで徹底解説
環境変数とは、次のような「キーと値」のペアとして表されるデータのことです。 KEY=VALUE この変数は、パソコン上で動くすべてのプログラム間で設定情報(コンフィグ)を共有するために使われています。 だからこそ、環境変数がどのような仕組みで動作し、Rubyプログラムから特殊な ENV オブジェクトを使ってどうアクセスするのかを学んでおくことが大切なのです。 環境変数の活用例 デフォルトエディターの設定 Rubyにgemの保存場所を伝える(GEM_PATH / GEM_HOME) APIキーをGitリポジトリにコミットすることなくアプリケーションへ渡す OSがバイナリファイル(Windo
-
Windows 10 で環境変数を設定・編集する方法を初心者向けに解説
環境変数とは、PC上で動作するプログラムの設定に使われるグローバルな値のことです。名前だけ聞くと難しく感じられますが、実際には「さまざまなアプリが共通して参照できる設定情報の保管場所」と考えると分かりやすいでしょう。 環境変数にはユーザーごとに紐づくものがあり、ユーザーアカウントが異なれば設定内容も変わります。その一方で、「%windir%」のようなシステム全体で共通の変数も存在します。たとえば「%windir%」は、Windowsがインストールされているディレクトリ(例:「C:\Windows」)を常に指します。アプリ側ではこの値を直接ハードコードせず、「%windir%」を参照することでW