環境変数はプロバイダ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:\
(*'-') >>
こんな感じ。