2013年1月8日火曜日

PowerShell+ckwでUnixシェルライクな環境構築

PowerShellがWindows環境では最高のシェルだと思われるのですが,非常に気になる点としてGUI周りはコマンドプロンプトから進化していないことが挙げられます.

そこで,今回はckwと組み合わせてUnixのシェルのように変更する方法について書きたいと思います.

ckwはシェルのGUIを改良する物で,powershellに限らずcmd.exeやnyaos等でも使えます.これを利用することで,文字色,背景色やウィンドウの透過率を変更したり出来るのですが,最大の利点はウィンドウの最大化が行えることだと思っています.恐ろしいことにcmd.exeやpowershellは画面幅が固定されていて,最大化しても画面幅は最大にならないようになっています.そのため,vimのようなコマンドラインベースのテキストエディタを使うときには,画面サイズを好きなように変更できなくて困ります.もう一つのメリットはコピーするときに画面端で改行されないようになることです(テキストエディタのようにコピーが出来る!何もすごいことではないのですが・・・).

私のckwの設定は以下の様にしています.

----

Ckw*foreground: #80FF80
Ckw*background: #000000
Ckw*cursorColor:     #c0c0c0
Ckw*cursorImeColor:  red

Ckw*title: ckw[cmd]
Ckw*exec: powershell.exe

Ckw*scrollHide:  no
Ckw*scrollRight: yes
Ckw*internalBorder: 1
Ckw*lineSpace: 0
Ckw*topmost: no
Ckw*transp: 235

Ckw*font: MeiryoKe_Console
Ckw*fontSize: 18

Ckw*geometry:  210x63+0+0
Ckw*saveLines: 10000
----

ここまでは,ウィンドウサイズが可変になっただけです.ここからが本番です.powershellではプロファイルを設定することによりプロンプトの表示内容や履歴の保存が可能になっています.
プロファイルの場所はpowershell上で$PROFILEと入力することで表示出来ます.

私は以下の様に設定しています.

----
#履歴の保存数を最大に設定
$MaximumHistoryCount = 32767

#履歴の設定
$HistoryFile = Join-Path (Split-Path $Profile -Parent) history.xml
Register-EngineEvent PowerShell.Exiting -SupportEvent -Action {
Get-History -count $MaximumHistoryCount | Export-Clixml $HistoryFile
}
if (Test-Path $HistoryFile) {
Import-Clixml $HistoryFile | Add-History
}

function Prompt
{
    $id = 1;
    $historyItem = Get-History -Count 1;
    if ($historyItem)
    {
        $id = $historyItem.Id + 1;
    }
Write-Host "$env:USERNAME.$env:USERDOMAIN@$env:COMPUTERNAME [" -NoNewLine -foregroundcolor DarkGreen
Write-Host "$id" -NoNewLine -foregroundcolor Cyan
Write-Host "] " -NoNewLine -foregroundcolor DarkGreen
Write-Host $(get-location) -foregroundcolor DarkYellow

return "> "
}

----

履歴の保存数は初期値が64なので最大値である32767に変更しています.残念なのはshort型の範囲でしか設定できないことですね.ここはzsh等のように全ての履歴を保存可能な値を設定できるようにして欲しいです.

履歴の設定では,終了時に履歴をxmlファイルに自動出力して,次回起動時に自動読み込みすることで,Unixシェルのヒストリ保存と同様の機能を持たせています.

プロンプトの設定では,ユーザー名,ドメイン,マシン名に加えて,履歴番号と現在のパスを1行で表示して,コマンド行は次の行になるように設定しています.素の状態だと現在のパスの直ぐ後にコマンドを入力することになるため,コマンドなのかパスなのかがわかりにくいですが,上記の様に設定することでパスとコマンドを見間違えることがないようにしています.


2013年1月3日木曜日

PowerShell:Windowsでおそらく最高のシェル

Windows環境だとシェルが貧弱という問題が良く取り上げられますが,実際貧弱だと思っていました.有名どころだと
  • コマンドプロンプト
設計が古すぎて論外.互換性が優先されているせいで新しくなる気配がない
  • Cygwin
Windows環境でUnixシェルが使える.便利だけれど環境によっては動作が遅い.他のPCに安易にインストールし難い.
  • Nyaos
Windows環境でUnixライクなシェルが使える.使っている人の評判は良さそうだが汎用性がない.

そのような状況を改善するためにMicrosoftが送り込んできたのがPowerShellなのですが,これの良いところは以下の様な物が挙げられます.
  • Windowsネイティブ
  • オブジェクト指向ベース
  • スクリプト言語としては,そこそこ高機能
  • .net framework等との連携
  • Windowsの管理者タスクが可能
  • ISEという統合開発環境が使える
 実際使用してみると,さすがに最新のシェルだけあった,初期状態で出来る範囲が広く,コマンドプロンプトとは比べものにならないです.特におもしろいと感じたのは,
  • オブジェクトベースのパイプ処理
 Unixシェルだと標準入出力によるパイプ処理になるのですが,それがオブジェクトになっているため,より多くの情報を渡せます.
  • sshライクのリモート接続
WindowsでもGUIなしでリモート接続出来るようになったので,これは便利です.ただし,リモート接続先のネットワークドライブには初期状態で接続出来ないのは残念なので改善してもらいたいです.

逆にイマイチだと感じたのは以下の点です.
  • 基本のGUIはコマンドプロンプトのまま
何故GUIが刷新されなかったのかは不明ですが,コマンドプロンプトと変わらない状態です.最大化しようともウインドウ幅が固定であったり,簡単にコピー&ペーストできない仕様であったり,コピーした物の画面端で改行されてしまう問題であったりと改善要望は多かったと思うのですが,互換性を重視したと言うことなのでしょうか.これについてはckwを利用すれば回避できるので,後日書こうと思います.
  • コマンドプロンプトのコマンドは完全互換ではない
コマンドはPowershellのコマンドレットのエイリアスとして設定されているだけで完全互換ではありません.そのためコマンドのオプションを使用している場合には対応するコマンドレットのオプションを探す必要があります.完全互換だと思って使用すると痛い目に遭うので,オプションを使用する場合は,別の物だと思ってしまった方が精神的に楽かもしれません.
  •  オブジェクトベースが仇となる場合もある
基本的に内部データがオブジェクトになるため,内部でのデータ量が大きくなりがちです.サイズの大きいデータを扱ったりする場合はテキストベースの方が有利になると思います.また,オブジェクトベースなのでデータを取り出すのに一手間必要であるところも取っつきにくいかもしれません.awkやsedのような事は出来るのですが(これはすごいことだと思います),すこし追加の処理が必要だったりします.
  • 絶望的に人気がない 
使ってみるとかなり良いのですが,人気が全然ありません.特に日本は酷いですね.人気と書籍の冊数は相関があると思うのですが,PowerShellの書籍は殆どありません.新しいという事を差し引いても少なすぎるように感じます.とはいえ,最近はWeb上にいくらでも情報があるので何とでもなるといえばなります.
  •  デフォルトエンコードがUTF-16
デフォルトエンコードがUTF-16なので,Out-File等を使うときに注意しなければいけない.コマンドプロンプトに合わせるためには以下の様にする必要があります.
Out-File -Encoding ascii out_file.txt

不満な点もあるのですが,Windows環境では最高のシェルだといえるのではないでしょうか.そして現時点で進化途上であり,今後の大幅な改良が期待できそうです.そういうわけで,MicrosoftはもっとPushしてコマンドプロンプトを絶滅させるつもりで広めていくべきです.

(続き)
PowerShell+ckwでUnixシェルライクな環境構築