シェルスクリプト

2009年03月20日

自分のプログラムの都合で、Windowsのバッチファイルにこんなことをさせたくなった。
プログラム hogepiyo.exe は、標準出力と標準エラーの両方に対して、UTF-8で文字列を出力する。
このプログラムをWindowsのコマンドプロンプト(cmd.exe)で実行すると文字化けしてしまうので、nkf(インストール済み)でシフトJISに変換して出力するようにしたい。
ただしその出力がさらに別のプログラムにパイプを使って投げられたりするため、「標準出力にnkfを掛けたものを標準出力に出し、標準エラーにnkfを掛けたものを標準エラーに出す」ことが条件である。すなわち標準出力と標準エラーを結合してnkfをかける
C:\> hogepiyo.exe 2>&1 | nkf -uWs
のような方法ではだめである。
UNIXの部屋 コマンド検索:リダイレクト (*BSD/Linux)を参考に少し悩み、以下のようにすればよいことがわかった。
C:\> ((hogepiyo.exe | nkf -uWs) 3>&1 1>&2 2>&3 | nkf -uWs) 3>&1 1>&2 2>&3
3>&1 1>&2 2>&3」とすることで、標準出力(「1」で表現)と標準エラー(「2」で表現)が交換される。すなわち上記のコマンドは、
  1. hogepiyo.exe | nkf -uWs」により、まずは標準出力をシフトJISに変換する。
  2. 1つ目の「3>&1 1>&2 2>&3」により、標準出力と標準エラーを一時的に交換する。
  3. 2つ目の「nkf -uWs」により、現時点の標準出力(元の標準エラー)もシフトJISに変換する。
  4. 2つ目の「3>&1 1>&2 2>&3」により、入れ替わっていた標準出力と標準エラーを元に戻す。
という手順で所望の動作を実現している。

なお、この方法はWindowsだけでなくUnix系OSのシェルでも利用できることを確認している。確認済みなのは以下のシェルである。
  • cmd.exe [6.0.6001]
  • bash [3.2.39(1)]
  • zsh [4.3.4]
  • sh(dash) [0.5.4-8ubu]
※3.26 誤字修正

maraigue at 20:21コメント(0)トラックバック(0) 
livedoor プロフィール

H. Hiro

  • ライブドアブログ