トップ «前の日記(06/28/2003) 最新 次の日記(06/30/2003)» 編集

本 日 の h o g e

hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。

更新情報の取得には rdflirs を使ってもらえると嬉しいです.


06/29/2003 cjkcodecs [長年日記]

tDiary 248日目

[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

*1 もちろんシングルクォート自体を格納したい場合はエスケープする必要がある.

*2 evalを知ってればの話だけど.

本日のツッコミ(全2件) [ツッコミを入れる]
なかの (06/29/2003 22:45)

/etc/portage/package.unmaskを作って、dev-python/japanesecodecs って書くといいかもしれない。
それとは別でUSE cjkの問題は確かにありますねぇ。c,j,kで分離したい方向なんですけどねぇ・・。なかなかそれに代わるいい案が思いつかない。

atzm (06/30/2003 18:23)

おぉっ,package.unmaskなんてものがあったとは…目から鱗です(汗).ありがとうございます.
use.descによるとcjkはマルチバイト文字を使う言語のサポートということになってるんですが,そうなるとロシア語などはどうなるのか,という気がしないでもないです.私的には分離してそれぞれuse jpとかにしちゃっても問題ないと思うんですが…やっぱり難しいんでしょうか.