echo $”hoge” と echo $’fuga’ みたいな引用符直前のドル記号の意味
あるプログラムを Linux でサービス起動させたくて、
/etc/init.d
にあるスクリプトを参考にしようと眺めてたら。
引用符の前にドル記号が付いてる echo
が
沢山出てきて何だこれはってなったので調べてみた。
例えば samba ではこんなの。
$ grep -A 14 '^start' /etc/init.d/smb
start() {
KIND="SMB"
echo -n $"Starting $KIND services: "
daemon smbd $SMBDOPTIONS
...
}
二重引用符の前にあるドル記号の意味
多言語対応用っぽい。
記号が上手く検索出来ないのと、ググり力不足とで、調べるのに苦労した。
多分こんな動き
echo $"hoge"
を見つけると、言語 ($LANG
あたり) に合ったメッセージを探す。
メッセージは $TEXTDOMAINDIR/<言語>/LC_MESSAGES/$TEXTDOMAIN.mo
か、
/usr/share/locale/<言語>/LC_MESSAGES/$TEXTDOMAIN.mo
から取り出してくれる。
冒頭に書いたサービス起動メッセージも確かに定義されてた。
init.d
スクリプトでは、大体 /etc/rc.d/init.d/functions
が使われてる。
ここには TEXTDOMAIN=initscripts
が定義されてる。
なので /usr/share/locale/ja/LC_MESSAGES/initscripts.mo
を覗いてみた。
$ msgunfmt /usr/share/locale/ja/LC_MESSAGES/initscripts.mo 2>/dev/null | grep -A 1 'Starting $KIND services: '
msgid "Starting $KIND services: "
msgstr "$KIND サービスを起動中: "
試してみる
LANG を変えたら確かにメッセージ変わった。
ローカライズされてることは使ってて何となく知ってたけど、
こんな仕組みだとは知らなかった。
# LANG=en_US.UTF-8
# service smb start
Starting SMB services: [ OK ]
Starting NMB services: [ OK ]
# LANG=ja_JP.UTF-8
# service smb start
SMB サービスを起動中: [ OK ]
NMB サービスを起動中: [ OK ]
参考
- BashFAQ/098 How to add localization support to your bash scripts - Greg’s Wiki
- シェルスクリプトの多言語対応 - レピカグループの技術者ブログ
- /etc/init.d/functions の解説 - 覚え書き
単一引用符の前にあるドル記号の意味
上記を調べてるとき、知人に教えて貰った。
二重引用符とは全く違う動き。
echo -e
の範囲限定版みたいな感じ。
$'...'
の部分だけエスケープが有効になる。
試してみる
$ echo '\n''\\n'
\n\\n
$ echo -e '\n''\\n'
\n
$ echo $'\n''\\n'
\\n
$ echo $'\n'$'\\n'
\n
参考
まとめ
-
echo $"hoge"
は多言語対応用。 -
echo $'fuga'
はエスケープ有効化。