環境変数はプロバイダEnvの中にあるよ
ちょいちょいシェルスクリプトを書いていて、うっかり変数$HOMEでホームディレクトリを参照してしまうわけですが、ふと気になって環境変数を覗いてみたらそんなのないです。
(*'-') >> Get-ChildItem env: | Where-Object {$_.Name -match "HOME"}
Name Value
---- -----
HOMEDRIVE C:
HOMEPATH \Users\home
(*'-') >> Get-Content $profile | Select-String "HOME"
(*'-') >>
ドライブとパスがそれぞれ別々に違う名前で設定されてますね。当然プロファイルファイルの$PROFILEにも書いてありません。おかしいな、ちゃんと$HOMEが正しく展開されているのに。。。
自動的に設定される自動変数
まぁ、環境変数も上記の通り一部自動的に設定されるんですが、PowerShellには自動変数というものがあるのを忘れていました。起動直後にGet-Variableで変数リストを覗いてみると…。
(*'-') >> Get-Variable | Where-Object {$_.Name -match "HOME"}
Name Value
---- -----
HOME C:\Users\home
PSHOME C:\Windows\System32\WindowsPowerShell\v1.0
(*'-') >>
ありました!
自動変数、普段無意識に使っているものもありますね。$PROFILEとか$_とか。
シェルスクリプトで使いそうな自動変数
個人的に使いそうなものをまとめてみました。
| 変数名 | 値 |
|---|---|
| $_ | 入力行一行分 |
| $^ | 入力行の行頭単語 |
| $$ | 入力行の行末単語 |
| $? | 直前のコマンド実行結果のBool値 |
| $Args | 引数リスト |
| $False | 偽のBool値 |
| $Home | ドライブレター込みのホームディレクトリパス |
| $LastExitCode | 直前のコマンドの戻り値 |
| $MyInvocation | 実行コマンド自身の情報 |
| $OFS | awkでお馴染みの出力時フィールドセパレータ |
| $PsVersionTable | PowerShellのバージョン情報 |
| $Pwd | ドライブレター込みのカレントディレクトパス |
| $True | 真のBool値 |
おまけ
$MyInvocationはスクリプト自身のパスが知りたいときに使いますね。
(*'-') >> Get-Location
Path
----
C:\
(*'-') >> Get-Content C:\Users\home\place.ps1
"Script Path: $(Split-Path -Parent $MyInvocation.MyCommand.Path)"
"Current Path: $Pwd"
(*'-') >> C:\Users\home\place.ps1
Script Path: C:\Users\home
Current Path: C:\
(*'-') >>
こんな感じ。