どさにっきクラウド 〜2009年1月上旬〜

by やまや
<< = >>

2009年1月5日(月)

賀正

_ 今日から仕事始めなのに、今日まで正月休みだと素で勘違いしてた。暮れから夕方に起きて明け方に寝る生活をずっと続けていたから、ふつーの時間に起きるのが辛いのなんの。

_ そんなわけで今年もゆるくいいかげんにはじまりました。2009年もよろしくお願いします。

.termcap

_ 元旦に FreeBSD 7.1-RELEASE が出てたはずだから、と出社早々 csup してみたものの、RELENG_7 はいまだに

REVISION="7.1"
BRANCH="PRERELEASE"
のままだった。あれー、おっかしーなー、と思ってたら、お昼過ぎにリリースのアナウンスメールが届いて、再度確認してみたら無事 STABLE になった模様。もいちど csup して世界を作る。release notes 読んでないからどこが変わったのかあんまり把握してないんだけど、まあ新年のご祝儀ということで。

_ インストールして再起動。dmesg 見てもとくに問題なし。おわり。

_ ……じゃなかった。

_ 端末上に文字を垂れ流すだけじゃなくて、ちゃんと画面制御してるツール類、つまり less とか vi とか、もっとはっきりいうと ncureses を使ってるもの、こいつらがおかしい。kterm を使ってると、less とか vi とかを終了したときにこいつらを起動する前の画面状態にいちいち戻してくれちゃったりするけど、これ嫌いなわけよ。終了後も less なり vi なりの画面の残骸が残ってる方が好みなわけよ。FreeBSD 4.x のころはそっちがデフォルトだったんだけど、最近はその挙動が変わっちゃったので、しかたなしに ~/.termcap で設定をいじってた。が、それが効かなくなった。画面の保存と復帰は ti/te なので、~/.termcap の kterm の設定で :ti@:te@: と書いて消せばいいはず。が、実際は

% tput ti | hd
00000000  1b 37 1b 5b 3f 34 37 68                           |.7.[?47h|
00000008
てな具合でエスケープシーケンスが出力されちゃう。空になってない。

_ うーん、/usr/share/misc/termcap の方を直接書き換えて cap_mkdb してやれば直るな。~/.termcap が無視されてんのか。いまいち解せないけど、悩むよりはとりあえずは目的の挙動に戻す方が大事なのでそれで。

_ つーか、xterm も何年も前から UTF-8 をサポートして日本語が表示できるようになってるわけだし、そろそろ kterm なんか捨てろ、ということなのかねぇ。TERM=xterm なら ti/te は空なわけだし。


2009年1月6日(火)

OSX の terminfo

_ cureses で思いだした。

_ UNIX な人が MacOSX で暮らすときには MacPorts だの Fink だのといったパッケージシステムも入れることが多いと思うんだけど、こいつらみんな OSX が自前で持ってる ncurses は使わず、強制的に自前の nucurses を別途インストールしやがんだよな。

_ んなもんだから、バイナリにリンクされている ncurses のライブラリが OSX 本来のものかパッケージシステムのものかによって参照される terminfo のパスが変わるんだ。だから画面制御まわりを自分好みにいじるときも、OSX 本来の terminfo とパッケージシステムの terminfo をどっちもいじらないといけない。それを忘れてどっちか片方しかやらないと、$TERM は同じなのにツールによって画面制御の挙動が違うなんてキモいことが起きる。これ、すげー気がつきにくい上に忘れがちなんでほんと勘弁してほしい。ncurses が複数あっても手間が増えるだけでうれしいことなんかなんにもないよ。

_ ちなみに terminfo な環境で less やら vi やらの表示の残骸を終了後にも残すには、infocmp の出力から smcup、rmcup を削除して tic すればよし。termcap な環境では /etc/termcap (とか ~/.termcap とか)をいじって ti、te を削除。


2009年1月7日(水)

サブシェル

_ いつも書いてからうまく動かず悩む。

echo hoge | while read a; do
    echo 1: a=$a
done
echo 2: a=$a
これ、実行しても while の外側の echo では値は出力されない。なぜなら while がサブシェルで実行されて、while の終わり=サブシェルの終わりとともになかったことになるから。わかってる。わかってるのについ無意識にこういうスクリプトを書いてしまってハマる。

_ こうすれば while の外まで値を持っていける。

echo hoge | (
    while read x; do
        a=$x
        echo 1: a=$a, x=$x
    done
    echo 2: a=$a, x=$x
)
echo 3: a=$a, x=$x
サブシェルで呼ばれるのなら、必要な部分をぜんぶ同じサブシェルの中で処理してしまえばいい。というわけで、() でくるむ。しょせん小手先のごまかしに過ぎないので、() の外に出たら値が消えてしまうのはしかたない。

_ ……という回避策があることもわかっている。わかっているのになんで毎度毎度同じ間違いをしでかすんだろうな。

_ ちなみに、ksh はこういう場合でもカレントシェルだけで済ませるので、

date +'%Y %m %d' | read year month day
echo $year $month $day
なんてのがふつーに動いたりする。sh では動かん。


<< = >>
やまや