環境変数
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はプログラミング言語である一方で、システムを管理するインタラクティブシェルとしても利用されている。環境変数はシステム管理を行うインタラクティブシェルとして必須の機能だ。今回取り上げたような操作は考えずとも自然にできるようにしておこう。
参考資料
- Microsoft PowerShell Module Browser
- Microsoft PowerShell6|Microsoft.PowerShell.Core|About|About Variables
- Microsoft PowerShell6|Microsoft.PowerShell.Core|About|About Environment Variables
- Microsoft PowerShell6|Microsoft.PowerShell.Management|Get-Item
- Microsoft PowerShell6|Microsoft.PowerShell.Management|Get-ChildItem
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|Get-Member
- Microsoft PowerShell6|Object Pipeline
- Microsoft PowerShell6|Understanding the Windows PowerShell Pipeline