環境変数

PowerShellの変数には特別な用途で使われるものがある。環境変数、自動変数、ユーザ定義変数などがそれにあたるが、今回はその中から環境変数を取り上げて紹介する。

環境変数は、プロセスをまたがってコピーが行われていく変数で、システム全体の挙動に影響を与えるものや、コマンドがデプロイされているフォルダの設定、基本的なパスの指定などの用途で使われる。どのオペレーティングシステムでも用意されているような基本的な機能だ。

PowerShell Coreにもこうした環境変数を扱うための機能が用意されている。環境変数の値はPowerShell Coreから起動されるアプリケーションやPowerShell Coreそのものの動作にも影響を与える。基本的な扱い方は最初に理解しておきたいところだ。

環境変数の表示

設定されている環境変数の一覧は、Get-ItemコマンドレットまたはGet-ChildItemコマンドレットにEnv:ドライブを指定することで表示することができる。

環境変数の一覧を取得する

PS /Users/daichi> Get-Item Env:

Name                           Value
----                           -----
PSModulePath                   /Users/daichi/.local/share/powershell/Modules:/usr/local/share/powershell/Modules:/usr/local/microsoft/powershell/6.0.2/Modules
LOGNAME                        daichi
PWD                            /Users/daichi
PATH                           /usr/local/microsoft/powershell/6.0.2:/Users/daichi/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public
SSH_AUTH_SOCK                  /private/tmp/com.apple.launchd.vcBgAbG1Kp/Listeners
LANG                           ja_JP.UTF-8
XPC_SERVICE_NAME               0
TERM_PROGRAM_VERSION           3.1.7
LS_COLORS                      di=32:ln=35:so=01:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30
TERM_SESSION_ID                w6t0p0:F5191D6B-ED3D-4314-8D39-55DFCFFD528D
SVN_EDITOR                     nvim
COLORFGBG                      7;0
SHLVL                          1
_                              /usr/local/bin/pwsh
Apple_PubSub_Socket_Render     /private/tmp/com.apple.launchd.h4CmSnQ9rB/Render
ITERM_PROFILE                  Default
TMPDIR                         /var/folders/2h/1b8rfbs95pl0f8mpj1qj3bxm0000gn/T/
ITERM_SESSION_ID               w6t0p0:F5191D6B-ED3D-4314-8D39-55DFCFFD528D
HOME                           /Users/daichi
TERM_PROGRAM                   iTerm.app
LSCOLORS                       cxFxCxdxBxegedabagacad
__CF_USER_TEXT_ENCODING        0x1F5:0:0
TERM                           xterm-256color
SHELL                          /bin/bash
COLORTERM                      truecolor
USER                           daichi
XPC_FLAGS                      0x0


PS /Users/daichi>

環境変数の名前を指定して個別に値を取得するには、次のようにEnv:の後に環境変数名を指定すればよい。

環境変数LANGを取得

PS /Users/daichi> Get-Item Env:LANG

Name                           Value
----                           -----
LANG                           ja_JP.UTF-8


PS /Users/daichi>

環境変数HOMEを取得

PS /Users/daichi> Get-Item Env:HOME

Name                           Value
----                           -----
HOME                           /Users/daichi


PS /Users/daichi>

PowerShell Coreでは、パイプラインを流れていくのはただのデータではなく、オブジェクトであることを、これまで何度か紹介してきた。表示されている環境変数も、実際には次のようにオブジェクトとして送られてきている。

取り出した環境変数もオブジェクトになっている

PS /Users/daichi> Get-Item Env:LANG | Get-Member


   TypeName: System.Collections.DictionaryEntry

Name          MemberType    Definition
----          ----------    ----------
Name          AliasProperty Name = Key
Deconstruct   Method        void Deconstruct([ref] System.Object key, [ref] ...
Equals        Method        bool Equals(System.Object obj)
GetHashCode   Method        int GetHashCode()
GetType       Method        type GetType()
ToString      Method        string ToString()
PSDrive       NoteProperty  PSDriveInfo PSDrive=Env
PSIsContainer NoteProperty  bool PSIsContainer=False
PSPath        NoteProperty  string PSPath=Microsoft.PowerShell.Core\Environm...
PSProvider    NoteProperty  ProviderInfo PSProvider=Microsoft.PowerShell.Cor...
Key           Property      System.Object Key {get;set;}
Value         Property      System.Object Value {get;set;}


PS /Users/daichi>

環境変数は次のように変数としてアクセスすることもできる。

環境変数LANGを取得

PS /Users/daichi> $Env:LANG
ja_JP.UTF-8
PS /Users/daichi>

環境変数HOMEを取得

PS /Users/daichi> $Env:HOME
/Users/daichi
PS /Users/daichi>

 

環境変数の設定

$Env:LANGのように環境変数を利用している場合、この変数の値を上書きすることで環境変数を書き換えることができるようになっている。

例えば、次のように、環境変数LANGがja_JP.UTF-8に設定されている場合、アプリケーションとして起動されるdateの実行結果は日本語になっている。

環境変数LANG=ja_JP.UTF-8でのdateの実行結果

PS /Users/daichi> $Env:LANG
ja_JP.UTF-8
PS /Users/daichi> date
2018年 7月19日 木曜日 16時44分58秒 JST
PS /Users/daichi>

次に、環境変数LANGの値を次のようにen_US.UTF-8に変更してからdateを実行する。こうするとdateコマンドの実行結果は英語に変わる。

環境変数LANG=en_US.UTF-8でのdateの実行結果

PS /Users/daichi> $Env:LANG = "en_US.UTF-8"
PS /Users/daichi> $Env:LANG
en_US.UTF-8
PS /Users/daichi> date
Thu Jul 19 16:45:33 JST 2018
PS /Users/daichi>

これは環境変数が生成される次のプロセスにコピーされているためだ。

環境変数LANGがja_JP.UTF-8の状態でdateを実行すると、dateが環境変数LANGの値に従って日本語で結果を出力する。環境変数LANGがen_US.UTF-8の状態でdateを実行すると、dateは環境変数LANGの値に従って英語で結果を出力する。これは環境変数LANGが新しく生成されるdateプロセスにコピーされているからで、あとはdate側が環境変数LANGの設定に応じて出力する内容を切り替えている。

環境変数が存在しない場合、「$Env:新しい名前 = 値」のように新しく変数を作って値を代入すると、自動的に環境変数として登録されるようになる。新しい環境変数を作成したいときは他の環境変数を設定するのと同じように操作するだけでよい。

環境変数の削除

設定した環境変数を削除する場合にはRemove-Itemコマンドレットを利用する。次のようにRemove-Itemコマンドレットの引数に$を指定しない状態で環境変数を指定すると、その環境変数が削除されるようになる。

設定されている環境変数を確認

PS /Users/daichi> Get-Item Env:

Name                           Value
----                           -----
SSH_AUTH_SOCK                  /private/tmp/com.apple.launchd.vcBgAbG1Kp/Lis...
SHLVL                          1
LANG                           en_US.UTF-8
XPC_FLAGS                      0x0
TMPDIR                         /var/folders/2h/1b8rfbs95pl0f8mpj1qj3bxm0000g...
SHELL                          /bin/bash
SVN_EDITOR                     nvim
TERM_PROGRAM_VERSION           3.1.7
ITERM_PROFILE                  Default
COLORFGBG                      7;0
PATH                           /usr/local/microsoft/powershell/6.0.2:/Users/...
__CF_USER_TEXT_ENCODING        0x1F5:0:0
TERM_SESSION_ID                w6t0p0:F5191D6B-ED3D-4314-8D39-55DFCFFD528D
COLORTERM                      truecolor
Apple_PubSub_Socket_Render     /private/tmp/com.apple.launchd.h4CmSnQ9rB/Render
XPC_SERVICE_NAME               0
_                              /usr/local/bin/pwsh
TERM_PROGRAM                   iTerm.app
HOME                           /Users/daichi
TERM                           xterm-256color
ITERM_SESSION_ID               w6t0p0:F5191D6B-ED3D-4314-8D39-55DFCFFD528D
LOGNAME                        daichi
PWD                            /Users/daichi
USER                           daichi
LS_COLORS                      di=32:ln=35:so=01:pi=33:ex=31:bd=46;34:cd=43;...
PSModulePath                   /Users/daichi/.local/share/powershell/Modules...


PS /Users/daichi>

環境変数LS_COLORSを削除

PS /Users/daichi> Remove-Item Env:LS_COLORS
PS /Users/daichi>

環境変数一覧からLS_COLORSが削除されていることを確認

PS /Users/daichi> Get-Item Env:

Name                           Value
----                           -----
SSH_AUTH_SOCK                  /private/tmp/com.apple.launchd.vcBgAbG1Kp/Lis...
SHLVL                          1
LANG                           en_US.UTF-8
XPC_FLAGS                      0x0
TMPDIR                         /var/folders/2h/1b8rfbs95pl0f8mpj1qj3bxm0000g...
SHELL                          /bin/bash
SVN_EDITOR                     nvim
TERM_PROGRAM_VERSION           3.1.7
ITERM_PROFILE                  Default
COLORFGBG                      7;0
PATH                           /usr/local/microsoft/powershell/6.0.2:/Users/...
__CF_USER_TEXT_ENCODING        0x1F5:0:0
TERM_SESSION_ID                w6t0p0:F5191D6B-ED3D-4314-8D39-55DFCFFD528D
COLORTERM                      truecolor
Apple_PubSub_Socket_Render     /private/tmp/com.apple.launchd.h4CmSnQ9rB/Render
_                              /usr/local/bin/pwsh
TERM_PROGRAM                   iTerm.app
HOME                           /Users/daichi
TERM                           xterm-256color
ITERM_SESSION_ID               w6t0p0:F5191D6B-ED3D-4314-8D39-55DFCFFD528D
LOGNAME                        daichi
PWD                            /Users/daichi
USER                           daichi
XPC_SERVICE_NAME               0
PSModulePath                   /Users/daichi/.local/share/powershell/Modules...


PS /Users/daichi>

環境変数の操作としてはこのあたりを抑えておけばよいだろう。

PowerShell Coreはプログラミング言語である一方で、システムを管理するインタラクティブシェルとしても利用されている。環境変数はシステム管理を行うインタラクティブシェルとして必須の機能だ。今回取り上げたような操作は考えずとも自然にできるようにしておこう。

参考資料