tech.guitarrapc.cóm

Technical updates

PowerShell コンソールにおける入力履歴管理について

Shellといえば、コンソール操作です。PowerShellにもpowershell.exeというコンソールがあります。

Linux/UNIXを使ってて感じるのは、コンソールの豊富なオプションによる使いやすさです。 これこそ、さすがCUIを中心に据えるだけのことがあると常々感じます。WindowsにおけるCUI = PowerShellというからにはもう少しこの辺は強くなってくれると嬉しいものです。

ちょっと便利に使うために、今回は、PowerShellコンソールユーザー向けに履歴呼び出しについてです。 一応これだけあるんですけど、好きな動作があればいいですね。

  • キーコードバインドでの呼び出し
  • 画面にだしたい
  • Get-History
  • ヒストリのタブ補完

履歴とは

ようは、コンソールで入力した過去の内容をさします。 例えば次のような入力があったとして

PS>ls
PS>ps
PS>ps -name powershell
PS>Get-Command

これらの入力履歴を呼び出すことを差します。

キーコードバインドでの呼び出し

も標準の呼び出しがあります。キーボードの ↑ / ↓ キーで履歴を遡ったり先に進めたりできます。 例えば、このような入力が終わったとして

PS>ls
PS>ps
PS>ps -name powershell
PS>Get-Command

次の入力待ちの状況で

PS>

キーボードの ↑ を入力すると1つ前の結果が表示されます。↑操作はF8でも実行できます。

後は、↑ / 下で自由にどうぞ。

PS>Get-Command

Linux / UNIXの動作と少し違うのが、履歴を移動して実行後も、戻った先で履歴の位置が保持され、入力した内容は履歴の最後に追加されます。 つまり、先の例で上を3回押して

PS>ps

で実行して、最後↑を押すと、

PS>ls

となります。 UNIX/Linux (bashなど) では、履歴を移動して実行後は履歴の最後に位置が戻りされ、入力した内容は履歴の最後に追加されます。 つまり、先の例で上を3回押して

[ec2-user@hoge ~]$ps

で実行して、最後↑を押すと、

[ec2-user@hoge ~]$ps

と、履歴で呼び出した最後のコマンドになります。 どっちがいいかは馴れでしょうが、PowerShellの位置保持はなかなか馴れません。

画面にだしたい

F7を押すだけで画面に履歴一覧が表示されます。↑ / ↓ で実行したいコマンドを選んでEnterするだけです。

f:id:guitarrapc_tech:20190531222025p:plain

ちなみに、F8なら↑と同様に履歴をさかのぼります。

Get-History

コマンドレットで履歴一覧も取得できます。

Get-History

エイリアスはこれです。

history

取得結果です。

PS> get-history

  Id CommandLine
  -- -----------
   1 ls
   2 ps
   3 ps -name powershell
   4 Get-Command

id指定でその番号のコマンドが何だったかも表示可能です。

Get-History -id 1

例では、こうですね。

PS> Get-History -id 1

  Id CommandLine
  -- -----------
   1 ls

また、このコマンド結果をすぐに実行も可能です。 それには、例によって、 &(アンーパサダント) か . (ドットソース) をつけて実行します。

&(Get-History -id 1)

これで、例では、id = 1に該当したlsが実行されます。 指定した件数分だけHistoryを取得する場合は、 -Countを利用します。 例えばこれで、過去2回の履歴が取得可能です。

Get-History -Count 2

こんな感じですね。

PS> Get-History -Count 2

  Id CommandLine
  -- -----------
   3 ps -name powershell
   4 Get-Command

ヒストリのタブ補完

タブ補完で、過去の入力で現在の入力から始まるものがないかを探すこともできます。 それには、 #探したい入力とします。 例えば、 Getから始まるコマンド履歴の補完には

#get

まで入力してTabを入力するだけです。Tabを押すごとに過去へ進んでいきます。Shift+Tabで先に進めることもでき、最後で止まったりはせず、最後までいったら自動的に最新の履歴にぐるぐる巡ります。

PS> &(Get-History -id 1)

あるいは、履歴のidも同様にできます。 例えば、例における1番目の履歴であるlsをすぐに呼ぶなら #に数字を付けるだけです。

#1

(つまり #1)まで入力してTabを入力するだけです。 すると、このようになります。

PS> ls

終わりに

PowerShellセッションを抜けると履歴が消えるのはRunSpaceだから。 もう少し、Linuxライクな動きを見習うともっとよくなりそうです。