hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。
06/29/2003 cjkcodecs [長年日記]
■ [Gentoo] cjkcodecs
なんかいつの間にかJapaneseCodecsがマスクされてるので /usr/portage/profiles/packages.mask の該当部分をコメントアウトしてマスクをひっぺがす.しかしこれから sync するたびにこれやらないかんのか,めんどくさいな.koreancodecsと統合してcjkcodecsにしたらしいが,当事者にとっては迷惑だろ.だって日本人は中国語や韓国語のサポートなんか普通いらんし,中国人は日本語のサポートなんかいらんだろ.なんでASCIIな人らはcjkを一緒にしたがるかね.
■ [Gentoo] 適当なスクリプト
#!/bin/sh ACT="clean depclean help info inject prune rsync search sync unmerge" USE="" OPT="" for ARG in ${@} do if echo "${ARG}" | grep "^-" > /dev/null 2>&1 || \ echo "${ACT}" | grep "${ARG}" > /dev/null 2>&1 then OPT="${OPT} ${ARG}" else USE="${USE} ${ARG}" fi done OPT=${OPT# } USE=${USE# } if [ -z "${USE}" ] then echo "You must select a use flag." fi { emerge -epv world | \ grep "\[ebuild N \] .\+ \( [\+\-].\+\)\+" | \ sed -e "s:\[ebuild N \] \(.\+\) \( [\+\-].\+\)\+:\1 \2:" | \ while read line do arg=${line#* } for each in ${arg} do if echo "${each#[\+\-]}" | grep "^${USE}\$" > /dev/null then echo "=${line%$arg}" break fi done done } | xargs emerge ${OPT}
性凝りもなく変なスクリプトを書いてみる.引数で指定したuseフラグを使ってるパッケージに対してemergeを実行する.useフラグを変更したときに実行すると良いかも知れない.今のところ指定できるuseフラグは一つのみ.
しかしもう少し効率化できんもんかね…ていうかPythonでportageライブラリ使って書けよって話ではあるが.
■ [Bash][Tips] クォートとドルカッコとドルカッコカッコと
中級者はもとより初級者にとっても常識だろうけど, Bash では普通,空白を区切りとして認識するので,例えば
HOGE=hoge hoge hogehoge
なんてことができない.それを解決するために文字列をクォートすることになる.
HOGE="hoge hoge hogehoge"
で,このとき " という文字自体を変数に格納したい場合,二通りのやり方が生まれる.
HOGE="\"hoge hoge hogehoge\""
HOGE='"hoge hoge hogehoge"'
ダブルクォートで文字列を囲む場合はメタ文字を理解させてしまうので,ちゃんとエスケープしてやらないとエラーになってしまう.逆にシングルクォートで囲むと,囲まれた全ての文字がエスケープされる.そのためどんな文字列を紛れ込ませても展開されることはない*1.
また,これとは別に バッククォートというものがあり,これは囲まれた文字列をコマンドとして認識し,その結果を返す.
$ HOGE=`date`
$ echo $HOGE
日 6月 29 08:36:20 JST 2003
また,バッククォート内のバッククォートをエスケープすることでネストも可能になる.
$ echo "uname -irsv" > comm.txt
$ HOGE=`\`cat comm.txt\``
$ echo $HOGE
Linux 2.5.54 #24 SMP Tue Jun 3 21:33:01 JST 2003 GenuineIntel
コマンドの結果を返すものとして,$() なんてものもある.
$ HOGE=$(date)
$ echo $HOGE
日 6月 29 08:49:01 JST 2003
$ HOGE=$(`cat comm.txt`)
$ echo $HOGE
Linux 2.5.54 #24 SMP Tue Jun 3 21:33:01 JST 2003 GenuineIntel
$ HOGE=$($(cat comm.txt))
$ echo $HOGE
Linux 2.5.54 #24 SMP Tue Jun 3 21:33:01 JST 2003 GenuineIntel
バッククォートとの違いはよく知らない.誰か教えて偉い人.
…まぁ,というようなことが理解できれば,以下のようなことができるのも分かるはず*2.
$ echo FOO > var.txt
$ FOO="uname -irsv"
$ HOGE=$(eval \$`cat var.txt`)
$ echo $HOGE
Linux 2.5.54 #24 SMP Tue Jun 3 21:33:01 JST 2003 GenuineIntel
またこれとは別に,$(())というものが存在する.これは式の評価を行なってくれる.
$ HOGE=$((1+3))
$ echo $HOGE
4
$ FOO=8
$ BAR=6
$ HOGE=$((($FOO - $BAR) ** 3))
$ echo $HOGE
8
/etc/portage/package.unmaskを作って、dev-python/japanesecodecs って書くといいかもしれない。
それとは別でUSE cjkの問題は確かにありますねぇ。c,j,kで分離したい方向なんですけどねぇ・・。なかなかそれに代わるいい案が思いつかない。
おぉっ,package.unmaskなんてものがあったとは…目から鱗です(汗).ありがとうございます.
use.descによるとcjkはマルチバイト文字を使う言語のサポートということになってるんですが,そうなるとロシア語などはどうなるのか,という気がしないでもないです.私的には分離してそれぞれuse jpとかにしちゃっても問題ないと思うんですが…やっぱり難しいんでしょうか.