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とかにしちゃっても問題ないと思うんですが…やっぱり難しいんでしょうか.