Next: Python, Previous: sh, Up: List of Programming Languages [Contents][Index]
GNU bash
2.0以降には、変数の中の文字列を翻訳して置き換えるための特別な略記法$"msgid"
があります。しかし、これによりもたらされるセキュリティーホールと可搬性の問題により、この機能の使用には
賛成できません。
$"..."
によるセキュリティーホールとは、その文字列にたいする翻訳を検索した後、‘eval’が2重引用符に囲まれた文字列や$
記号、バッククォートされた文字列にたいして行うのと同様なことをbash
が行う点にあります。
0x60
の文字が存在します。たとえば、これらのlocaleでは\xe0\x60
というバイト並びは1つの文字です。bash
の多くのバージョン(bash-2.05以降、およびmbsrtowcs()関数を持たないプラットフォーム向けの新しいバージョン)は、文字境界を認識しないので、特定のChinese文字をバッククォートと認識します。このため翻訳の一部がコマンドリストとして実行されてしまうことが起こり得るのです。この状況は翻訳者が気をつけていても起こり得ます。翻訳者が翻訳をUTF-8エンコーディングで提供したとしても、その翻訳はgettext()
関数によって翻訳者のエンコーディングからユーザーのlocaleのエンコーディングに変換され、その変換によって"危険な"\x60
というバイトが生成される可能性があるからです。
"`...`"
や、$カッコ"$(...)"
を使用することもあり得るので、それらに囲まれた文字列はコマンドリストとしてシェルにより実行されてしまいます。
可搬性の問題とは、bash
をインターナショナリゼーションのサポート付きでビルドしなければならないことです。これはlibcにgettext()
関数がないシステムでは、通常できません。