それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

cygwinでwindowsの各種コマンドを使う。UTF-8出力で。 CygwinでNKF。

nkfWindows

nkfWindows 版を探すより phpruby で標準出入力をやりとりした方が楽。

Cygwinの場合はnkf を使えばいい。

インストール→cygwinにNKFが無いのでビルドしよう - それマグで!

cygwinutf-8利用にnkf は便利。

CygwinUTF-8が便利です。内部的にUTF-8化されています。とても便利に感じます。しかしWindowsのコマンド類はSJISを出力します。

cygwin+mintty でUTF-8を使っていると、ls.exe は問題なくutf-8で日本語ファイル名を出力してくれて便利です。一方でwindowsのコマンドはSJISを出力するので、化けます。ipconfig/ping/dir などが代表例です。

UTF-8環境と、Windowsのコマンド類は、文字コード共存が悩ましい問題です。

そこでよく使うWindowsコマンドは出力をUTF-8に変換して使うことを思いつきました

NKFにかけてUTF-8で出力する。

alias ipconfig='ipconfig | nkf -w'
alias ifconfig='ipconfig | nkf -w'


そのほかに引数展開するようなコマンドは
function するかシェルスクリプト作れば、問題なくラッパーが作れることに気づきました。

cscript をラップしてUTF-8にする関数

function cscript(){ 
  cscript.exe `cygpath -w $@` | nkf -w ;
}


alias では引数展開がうまくいかないので関数を使いました。しかし関数でも、オプションの解決が不満だったので、シェルスクリプトにしました。

/usr/local/bin/cscript

#!/usr/bin/env bash
#引数からパスを見つけてWindowsパスに変換する
function cygpath_to_winpath(){
  args=()
  for i in $@ ; do
    if [ -s $i ]; then
      args=(${args[@]} `cygpath -w $i`)
    else
      args=(${args[@]} $i)
    fi
  done
  echo ${args[@]}
  return 0
}
cscript.exe  `cygpath_to_winpath $@` | nkf -w 

bashの場合、aliasの代わりにfunctionが使える。

alias がお手軽で良いのですが、引数展開やパイプを複雑にやるには向いてませんでした。そこで関数を使いました。関数だとテストがしにくく管理しにくいので、シェルスクリプトにしました。

aliasの代わりにコマンドを定義する、functionを作る、それでも不満ならシェルスクリプトが使えると知りました。Bashのコマンドは選択肢が広いです。選択肢が多いことはすばらしいことですね。

2013/09/28追記 汎用化コマンド作ってあるよ!

ブクマコメントに cscript ではなく、汎用化がほしいということでしたので。すでにあります!

Windowsコマンドのラッパーを作って、Cygwinを快適にする - それマグで!

Cygwin(msys)のUTF-8環境便利にするコマンドラッパー - それマグで!