プロファイルとは

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に指定する「名前」を変更すれば、その変更した「名前」のコマンドレットや関数のヘルプが表示されるようになる。

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>

特によく利用するコマンドレットや関数についてはこんな感じでより短い入力で処理できるようにしておくと便利である。