プロファイルとは
PowerShell Coreをしばらくインタラクティブシェルとして使っていると感じると思うが、コマンドレットや関数の名前が長くて打つのが面倒臭い。補完機能があるのでまったく入力補助がないのに比べるとマシなのだが、それでもUNIX系のシェルに慣れているとこれは煩わしいことこの上ない。今回はこうした面倒くささを低減するためにプロファイルを利用する方法を紹介しようと思う。
「【第3回】コマンドとは? - コマンドレット、関数、エイリアス、アプリケーションの違い」でコマンドの種類を説明したが、その中にユーザが定義して利用できる関数と、短縮名を設定できるエイリアスがあった。
ユーザが作成した関数やエイリアスは、PowerShell Coreを終了すると消えてしまうのだが、PowerShell Coreの起動時に自動で再設定することもできる。それがプロファイルだ。
プロファイルに関数の定義やエイリアスの設定を書いておけば、起動時にその処理が実行されるようになる。この機能を利用すればよく使うコマンドをもっと短く入力できるようになる。
プロファイルを利用する
プロファイルのパスは、PROFILE変数に書き込まれている。この変数のパスに配置されたファイルに設定を書けばよい。ちなみに、次のようにGet-Variableコマンドレットを使うとPROFILE変数の値を知ることができる。
Get-VariableでPROFILE変数の値を出力
PS /Users/daichi> Get-Variable PROFILE
Name Value
---- -----
PROFILE /Users/daichi/.config/powershell/Microsoft.PowerShell_profile.ps1
PS /Users/daichi>
上記コマンドはmacOS High Sierraで実行したものだ。/Users/daichi/はホームディレクトリなので、ようするにこの環境では「$HOME/.config/powershell/Microsoft.PowerShell_profile.ps1」がプロファイルになっていることがわかる。
このファイルの存在をGet-ChildItemコマンドレットで確かめてみると、次のように、そもそもディレクトリが存在していないことがわかる。なお、Get-ChildItemはDOSであればdirコマンド、シェルであればlsコマンドのような使い方ができるコマンドレットだ。
Get-ChildItemで調べると、対象となるディレクトリが存在していない
PS /Users/daichi> Get-ChildItem $PROFILE/../
Get-ChildItem : Cannot find path '/Users/daichi/.config/powershell/' because it does not exist.
At line:1 char:1
+ Get-ChildItem $PROFILE/../
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (/Users/daichi/.config/powershell/:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
PS /Users/daichi>
さらにひとつ上のディレクトリを調べると、次のように、存在することがわかる。つまり、ここでは$HOME/.configまでは存在している。
どこまでディレクトリが作成されているか調べる
PS /Users/daichi> Get-ChildItem $PROFILE/../../
Directory: /Users/daichi/.config
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2014/01/23 15:45 muse.org
d----- 2018/05/10 19:13 NuGet
d----- 2016/09/22 21:12 nvim
d-r--- 2017/12/12 12:31 s-tui
PS /Users/daichi>
このディレクトリは必ず用意されているものではないのだが、比較的最近のUNIX系アプリケーションはこのディレクトリを使うことが多いので、いつの間にかできていることが多い。
では、プロファイルのパスに設定されているディレクトリ「$HOME/.config/powershell/」を作成しよう。PowerShell Coreでは、New-Itemコマンドレットでファイルやディレクトリ、リンクなどを新規作成できる。
New-Itemでプロファイルが納められるディレクトリを作成
PS /Users/daichi> New-Item -ItemType Directory -Path $PROFILE/..
Directory: /Users/daichi/.config
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2018/05/11 9:24 powershell
PS /Users/daichi>
Get-ChildItemコマンドレットで作成されたディレクトリを確認してみる。
Get-ChildItemコマンドレットで作成したディレクトリを確認
PS /Users/daichi> Get-ChildItem $PROFILE/../..
Directory: /Users/daichi/.config
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2014/01/23 15:45 muse.org
d----- 2018/05/10 19:13 NuGet
d----- 2016/09/22 21:12 nvim
d----- 2018/05/11 9:24 powershell
d-r--- 2017/12/12 12:31 s-tui
PS /Users/daichi>
これで準備完了だ。
続いて、プロファイルに作業を短縮するための関数やエイリアスを追加していく。今回は手始めにオンラインマニュアルを表示するための「Get-Help 名前 -Online」という処理を、「manweb 名前」という入力で実行できるように関数を作成する。
関数の作成方法はいずれ説明するとして、ここではとりあえずその結果だけを示しておく(以下参照)。
PowerShellオンラインマニュアルを表示するためのmanweb関数
PS /Users/daichi> Get-Content $PROFILE
function manweb {
Param(
[String] $Command = 'Get-Help'
)
Get-Help $Command -Online
}
PS /Users/daichi>
Get-ContentコマンドレットはDOSであればtype、シェルであればmoreやlessのような処理を実施できるので、これを使って上記のように作成したプロファイルの中身を表示させている。
プロファイルの作成や編集自体は自分が普段使っているエディタを使ってもらえればと思う。作成したら一旦PowerShell Coreを終了して、もう一度起動する。この状態ですでにmanwebという関数が使えるようになっているはずだ。たとえば次のようにmanweb関数を実行してみよう。
作成してmanweb関数を実行
PS /Users/daichi> manweb Get-Help
PS /Users/daichi>
すると次のようにシステムデフォルトに設定されているWebブラウザにGet-Helpコマンドレットのオンラインヘルプが表示されると思う。manwebに指定する「名前」を変更すれば、その変更した「名前」のコマンドレットや関数のヘルプが表示されるようになる。
特にPowerShell Coreを使いはじめた最初の段階では頻繁にヘルプを引くことになると思うので、こんな感じでよく使う処理は短縮実行できるようにしておくと便利だ。
エイリアスのエイリアスを設定
前回の連載で、コマンドレットや関数を学ぶ優先順位として、エイリアスが設定されているものから調べていく方法を紹介した。設定されているエイリアスはGet-Aliasコマンドレットで表示できるのだが、これがまた長くて面倒くさい。できればaliasで表示したいところだ。
そんなわけでプロファイルに次のように「Set-Alias -Name alias -Value Get-Alias」という設定を追加しておく。これでaliasがGet-Aliasへのエイリアスになる。
プロファイルにalias→Get-Aliasというエイリアスを追加
PS /Users/daichi> Get-Content $PROFILE
function manweb {
Param(
[String] $Command = 'Get-Help'
)
Get-Help $Command -Online
}
Set-Alias -Name alias -Value Get-Alias
PS /Users/daichi>
設定を追加したら一旦PowerShell Coreを終了して、もう一度PowerShell Coreを実行する。これで設定が反映されたので、aliasと実行すると次のようにエイリアス一覧が表示されるようになる。
設定してエイリアスであるaliasでエイリアス一覧を表示
PS /Users/daichi> alias
CommandType Name Version Source
----------- ---- ------- ------
Alias ? -> Where-Object
Alias % -> ForEach-Object
Alias alias -> Get-Alias
Alias cd -> Set-Location
Alias chdir -> Set-Location
Alias clc -> Clear-Content
Alias clear -> Clear-Host
...略...
Alias sal -> Set-Alias
Alias saps -> Start-Process
Alias sbp -> Set-PSBreakpoint
Alias select -> Select-Object
Alias set -> Set-Variable
Alias si -> Set-Item
Alias sl -> Set-Location
Alias sls -> Select-String
Alias sp -> Set-ItemProperty
Alias spjb -> Stop-Job
Alias spps -> Stop-Process
Alias sv -> Set-Variable
Alias type -> Get-Content
Alias where -> Where-Object
Alias wjb -> Wait-Job
PS /Users/daichi>
特によく利用するコマンドレットや関数についてはこんな感じでより短い入力で処理できるようにしておくと便利である。