2011/07/07

パイプコマンド中の終了ステータス取得

シェルスクリプトでは頻繁に複数のコマンドをパイプで連結して使用するが、 パイプの途中のコマンドの終了ステータスは通常では参照できない。
そこでリダイレクトを利用してパイプの途中のコマンドの 終了ステータスを取得する方法を考えてみる。

  1exec 3>&1
  2ret1=`{ { command1; echo $? 1>&3; } | command2; } 3>&1`
  3ret2=$?
    
exec を利用してあらかじめ FD3 を利用可能にしておき、 command1 の終了ステータスを FD3 に出力している。
command2 の実行後に FD3 の出力を FD1(標準出力) に変更しているので、 ret1 は標準出力から command1 の終了ステータスが取得できる。 command2 の終了ステータスはそのまま $? を参照して ret2 に格納される。

2011/07/04

awk (1) 小技

先日参加した勉強会で awk (1) 関連の発表があったので、 ちょっとした小技を紹介してみる。

system() を利用する際の注意
awk の中で外部コマンドを実行する場合は 組み込み関数 system() が利用できるが、 この関数を利用して外部コマンドを実行すると 入出力 stream がオープンされるので、 ファイルディスクリプタが消費されてしまう。
従って awk 内で何度も system() を実行すると、 オープンできるディスクリプタの上限を超過してしまい、 awk の実行が中断されてしまう可能性がある。
その場合 close() を利用して system() がオープンした stream を閉じれば良いのだが、 awksystem() では stream を明示的に扱わない。 そこで system() で実行したコマンドを close() の引数で指定する事で stream を閉じる事ができる。
  1awk '{
  2    :
  3    # コマンドを生成
  4    command = sprintf("%s %s %s", command, arg1, arg2);
  5    # コマンドを実行して結果を取得
  6    buf = system(command);
  7    # stream をclose
  8    close(command);
  9    :
 10}'
            
関数内ローカルな変数の使用
nawkfunction を利用する事で 内部関数を作成する事ができるが、 関数内でローカルな変数を明示的に定義する事ができない。 そこで関数宣言の仮引数部に変数を定義する事で、 関数内ローカルの変数として利用できる。
  1awk '{
  2        :
  3    # 関数 foo の定義
  4    #   num: ループ数
  5    # 以下ローカル変数
  6    #   i: ループウンタ
  7    function    foo(num,        i)
  8    {
  9        # i はローカル変数扱いなので呼出元の i は影響を受けない
 10        for(i=0; i<1num; i++)
 11            :
 12        }
 13    :
 14    foo(num);
 15        :
 16    }'
            
但し関数呼び出し時と関数定義時に引数の数が等しくないので、 後に混乱しないためにコメントで明記するなどの処置は必要。

2011/07/01

Keyboards

現在職場で愛用中のキーボード達。
改めて見ると個人所有のキーボードが沢山あって驚いた。

PFU Happy Hacking Keyboard PD-KB02

Image: RIMG0044.JPG

PFU Happy Hacking Keyboard PD-KB02

Happy Hacking Keyboard としては2代目の製品かな? いちばん古くから愛用しているキーボード。
メンプレンスイッチのキータッチと シリンドリカル・カーブドスカルプチャの構成は 今でもいちばん気に入っていて、 FreeBSD 端末に接続されている。 プログラムを書くときは、このキーボードと FreeBSD と vi が必須。

PFU Happy Hacking Keyboard Professional 2 PD-KB400WN

Image: RIMG0045.JPG

PFU Happy Hacking Keyboard Professional 2 PD-KB400WN

USB 接続タイプの新世代 Happy Hacking Keyboard。
静電容量無接点方式で押下圧が 45g なので、 キータッチは PD-KB02 に比べると若干軽く感じるが、 打鍵音が若干「カチャカチャ」気味なのが気になる。 シリンドリカル・ステップスカルプチャなので、 手を自然に置いた時の感じが PD-KB02 とは若干異なり 微妙な違和感を感じる。

Apple Wireless Keyboard MB167LL/A

Image: RIMG0043.JPG

Apple Wireless Keyboard MB167LL/A

薄型 Bluetooth 接続の Apple Wireless Keyboard で、 AA セルを 3 本利用する初代タイプ。
酸化皮膜処理のアルミニウムボディは非常に美しいのだが、 パンタグラフタイプなのでキータッチが軽すぎ、 しかもストロークが短いので打鍵感が頼りなく感じてしまい、 キー入力時に底打ちしてしまうのが微妙に使いづらい感じ。 以前は 27インチの iMac のメインキーボードとして活躍してた。 現在は自宅の TV に接続されている Mac MINI のキーボード。

Lenovo ThinkPad USB TrackPoint Keyboard 55Y9003

Image: RIMG0046.JPG

Lenovo ThinkPad USB TrackPoint Keyboard 55Y9003

かつての IBM Space Saver Keyboard の流れをくむ トラックポイントが搭載された薄型のキーボード。
こちらもパンタグラフタイプなのでキータッチが軽く、 ストロークも短めなので本家 IBM Space Saver Keyboard ほどは打鍵感が良くない。

Apple USB Keyboard

Image: RIMG0047.JPG

Apple USB Keyboard

USB 接続の Apple 社純正フルキーボード。
メンプレンスイッチの打鍵感は素晴らしく、 シリンドリカル・カーブドスカルプチャなので違和感を感じない。
テンキーが付いているフルキーボードは邪魔なのだが、 Macintosh 独特の特殊キー(コマンドキー)をクリックしながら 電源をオンにするといった特殊な用途のために USB 接続の純正キーボードが必要な場合がまれにあるので 手元に置いてある。

Fujitsu FKB8745-T101

Image: RIMG0041.JPG

Fujitsu FKB8745-T101

一部では割と有名な富士通高見澤製のキーボード。
メンプレンスイッチのキータッチと シリンドリカル・カーブドスカルプチャというのは PD-KB02 と同じ構成だ。
そもそも PD-KB02 も富士通高見澤製なので 打鍵感なども殆ど変わらない。 PD-KB02 にファンクションキーと カーソルキーを付けた様なものだと思う。
Windows マシンを操作する場合はカーソルキーやファンクションキーが あった方が楽なので手元に置いてあったのだが、 今は手元に Windows マシンがなくなってしまったので、 サーバルームのコンソール用に利用している (良いキーボードなので若干勿体ないな)。

PFU Happy Hacking Keyboard Type-S PD-KB400WNS

Image: RIMG0294.JPG

PFU Happy Hacking Keyboard Type-S PD-KB400WNS

前述の Happy Hacking Keyboard Professional の進化版。
従来のモデルに比較するとキータッチが格段に良くなっている。 カチャカチャ音が完全に消されていて 静かで心地よい音になっているので、 静かなオフィスでも気にせずにタイピングに集中できるし 何よりも打鍵音に安っぽさがなくなって非常に良い感じ。
しかも各キーの軸が安定していてブレる感じがないので キー入力時に全く不快感を感じなくなった。 Type-S という名称だけど全然別モノな感じでとても良い。 現在は iMac に接続されているが、 今の所 PD-KB02 と同じ位気に入った。
問題は高価な事かな。


Copyright © Mitzyuki IMAIZUMI 2008,2009. All rights reserved.