目次


Linux の 101 試験対策

ローカリゼーションと国際化対応

システムを現地のニーズに適応させる

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: Linux の 101 試験対策

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:Linux の 101 試験対策

このシリーズの続きに乞うご期待。

概要

このチュートリアルで学ぶ内容は以下のとおりです。

  • ロケールの設定と環境変数を構成する方法
  • タイムゾーンの設定と環境変数を構成する方法

時刻、場所、言語

世界中で使用されている言語は数千種類にものぼります。数字や日付が異なる書式で表記される場合もあり、40 を超えるアルファベット (または表意文字セット) があります。人々が時刻を表すときには、12 時間制が使われることも、24 時間制が使われることもあります。さらに、建材から日常的に使う紙に至るまで、あらゆるものにそれぞれ異なる測定システムがあります。これらのバリエーションは、総称してロケールと呼ばれます。このチュートリアルでは、Linux システムをロケールに合わせるための構成方法を説明します。

また、皆さんが 1 日 24 時間を過ごすタイムゾーンは私のタイムゾーンとは異なることもあるので、タイムゾーンの設定とタイムゾーン関連の環境変数を構成する方法についても説明します。

このチュートリアルは、LPIC-1 (Linux Professional Institute Certification レベル 1) 102 試験の主題 107 の目標 107.3 の試験対策に役立ちます。この目標の重要度は 3 です。

前提条件

このシリーズのチュートリアルを最大限に活用するには、Linux の基礎知識と、チュートリアルに記載されたコマンドを演習できる実際の Linux システムが必要です。また、GNU および UNIX コマンドの知識もなければなりません。プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストとまったく同じであるとは限りません。

特に断りのない限り、このチュートリアルの例では、Wayland が稼働する Fedora 25 と、X11 を稼働する Ubuntu 16.04 LTS を使用しています。

ローカリゼーションと国際化対応

特定のロケールのニーズを満たすようにシステムを適応させることを、ローカリゼーションと呼びます。ローカリゼーションは l18n と省略されることもよくあります。ここで、数字 18 は最初の l から終わりの n までの間にある 18 個の文字を表します。システムを特定のロケールに適応させるには、そのような適応機能がシステムに備わっていなければなりません。別のロケールに適応可能なソフトウェアを作成するプロセスは、国際化対応と呼ばれます。国際化対応も同じように i18n と省略されることがあります。

ロケールの設定と環境変数

Linux システムをインストールする際は、使用する言語と、そのシステムを使用する国に適したキーボードを設定します。言語とキーボードの設定を表示するには、localectl コマンドを使用します。システムに設定されている言語を確認するだけであれば、LANG 環境変数の値を表示するコマンドを使うこともできます。これらのコマンドをどのように使用するのかを、私が使用している Fedora 25 システム上を例に、リスト 1 に記載します。注: localectl を単独で使用すると、デフォルトでステータスが表示されます。

リスト 1. システム設定の表示方法
[ian@atticf25 ~]$ localectl status
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
[ian@atticf25 ~]$ echo $LANG
en_US.UTF-8

ご覧のように、私は米国 (us) のキーボードを使用していて、言語は en_US.UTF-8 に設定しています。LANG 設定は、通常は 2 文字の小文字からなる言語コードの後に下線 (_) と 2 文字の大文字からなる国コードが続き、その後にピリオドとコード・ページ、つまり文字セット名 (この例では UTF-8) が続くという形になります。ある特定の言語に該当する 2 文字の ISO 639‑1 コードがない場合は、3 文字の ISO 639‑2 コードが使用されます。例えばイタリアのフリウリ地方で使われているフリウリ語には、fur_IT が使用されます。サンプル・コードのいくつかでそうなっているように、コンテキストによっては、設定に含まれる部分の大文字と小文字が区別されない場合もあります。

-a (または --all-locales) オプションを指定した locale コマンドを使用すると、システム上で使用可能なすべてのロケールのリストを表示することができます。Fedora システムの場合、このリストはかなり長くなるため、リスト 2 にはリストの一部を抜粋しています。一方、私が使用している Ubuntu 15.04 LTS システム上では、インストール時に、使用する言語として英語だけを選択したので、ロケールのリストは英語のロケールだけに限定されています。

リスト 2. 利用可能なロケールをリストアップする方法
[ian@atticf25 ~]$ # Display all French locales
[ian@atticf25 ~]$ locale --all-locales | grep fr_
fr_BE
fr_BE@euro
fr_BE.iso88591
fr_BE.iso885915@euro
fr_BE.utf8
fr_CA
fr_CA.iso88591
fr_CA.utf8
fr_CH
fr_CH.iso88591
fr_CH.utf8
fr_FR@euro
fr_FR.iso88591
fr_FR.iso885915@euro
fr_FR.utf8
fr_LU
fr_LU@euro
fr_LU.iso88591
fr_LU.iso885915@euro
fr_LU.utf8
[ian@atticf25 ~]$ # Display all Friulian locales
[ian@atticf25 ~]$ locale --all-locales |grep "^fur"
fur_IT
fur_IT.utf8
[ian@atticf25 ~]$ # How many locales are on this system?
[ian@atticf25 ~]$ locale -a | wc -l
823

ロケールのカテゴリー

前述したように、値の書式や通貨記号など、ロケールによって異なってくる要素は他にもあります。これらの要素はカテゴリーにグループ化されています。locale コマンドを使用して現在の設定を表示してください (リスト 3 を参照)。

リスト 3. ロケール設定の表示方法
[ian@atticf25 ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

通常、上記の設定は総称して LC_* と呼ばれます。echo コマンドを使用して表示できるかどうかを試してみるとわかりますが、これらの設定は実際の環境変数ではありません。ただし、値を代入することはできます。

LC_CTYPE、LC_COLLATE、LC_MESSAGES、LC_MONETARY、LC_NUMERIC、および LC_TIME の値は POSIX によって定義されています。GNU C ライブラリーは、さらに LC_IDENTIFICATION、LC_MEASUREMENT、LC_NAME、LC_PAPER、LC_TELEPHONE もサポートしています。これらの追加の値については、すべての UNIX 系オペレーティング・システム上で使用できるわけではないことに注意してください。

各カテゴリーには、1 つ以上のキーワードが含まれています。1 つ以上のカテゴリー名またはキーワード名を指定して locale コマンドを使用すると、該当するカテゴリーまたはキーワードに関する情報が表示されます (リスト 4 を参照)。

リスト 4. カテゴリーまたはキーワードに関する情報の表示方法
[ian@atticf25 ~]$ locale LC_NUMERIC
.
,
3;3
46
44
UTF-8
[ian@atticf25 ~]$ locale thousands_sep decimal_point
,
.

リスト 4 の出力表示はとりわけ役に立つというわけではありませんが、単一のキーワードの値が必要な場合は別です。c (または --category-name) オプションを追加するとカテゴリー名が表示され、k (または --keyword-name) オプションを追加するとキーワード名が表示されます。この 2 つのキーワードを同時に使用することもできます。特に複数のカテゴリーを表示する場合は、この方法が役立ちます。リスト 5 に、これらのオプションの例をいくつか記載します。

リスト 5. locale-c および -k オプションの使用方法
[ian@atticf25 ~]$ locale --category-name --keyword-name LC_NUMERIC LC_PAPER
LC_NUMERIC
decimal_point="."
thousands_sep=","
grouping=3;3
numeric-decimal-point-wc=46
numeric-thousands-sep-wc=44
numeric-codeset="UTF-8"
LC_PAPER
height=279
width=216
paper-codeset="UTF-8"
[ian@atticf25 ~]$ locale -ck thousands_sep decimal_point height
LC_NUMERIC
thousands_sep=","
LC_NUMERIC
decimal_point="."
LC_PAPER
height=279

ロケール設定を変更するには、LANG の値を変更します。例えば LANG=en_GB.UTF8 とすると、米国英語ロケールのすべての設定が英国英語の設定に変更されます。これにより、LC_* 設定のすべても変更されます。リスト 6 に示されているのは、Ubuntu 16.04 LTS システム上での例です。通常の環境変数に対する値の代入とは異なり、LANG の変更は子プロセスにも継承されるため、変更した LANG の値をエクスポートする必要はありません。

Ubuntu などの Debian ベースのシステムには、LANGUAGE という設定が追加されています。この設定の値は、LANG の値を変更しても変更されないことに注意してください。通常、LANGUAGE の値はシステム言語と同じですが、メッセージに使用できる複数の言語のコロン区切りリストに設定することもできます。この設定は、メッセージが特定の言語で提供されていない場合のフォールバック・メカニズムになります。

リスト 6. Ubuntu 上での LAMG および LANGUAGE 設定
ian@attic-u16:~$ LANG=en_GB.UTF8
ian@attic-u16:~$ locale
LANG=en_GB.UTF8
LANGUAGE=en_US
LC_CTYPE="en_GB.UTF8"
LC_NUMERIC="en_GB.UTF8"
LC_TIME="en_GB.UTF8"
LC_COLLATE="en_GB.UTF8"
LC_MONETARY="en_GB.UTF8"
LC_MESSAGES="en_GB.UTF8"
LC_PAPER="en_GB.UTF8"
LC_NAME="en_GB.UTF8"
LC_ADDRESS="en_GB.UTF8"
LC_TELEPHONE="en_GB.UTF8"
LC_MEASUREMENT="en_GB.UTF8"
LC_IDENTIFICATION="en_GB.UTF8"
LC_ALL=

場合によっては、システム言語やロケールの設定を変更せずに、LC_* カテゴリーを変更する必要が生じることもあります。大抵、このような変更はスクリプト内で行いますが、単一のコマンドに対して環境をオーバーライドすることもできます。その場合、locale コマンドに LC_ALL を設定してカテゴリーのすべてを同時に変更するか、1 つ以上の個別のカテゴリー (LC_MONETARY など) を設定して該当するカテゴリーをオーバーライドします。リスト 7 に、Ubuntu 16.04 LTS システム上での例をいくつか記載します。

リスト 7. ロケール設定のオーバーライド方法
ian@attic-u16:~$ locale -ck int_curr_symbol currency_symbol
LC_MONETARY
int_curr_symbol="USD "
LC_MONETARY
currency_symbol="$"
ian@attic-u16:~$ LC_ALL=en_GB.UTF8 locale -ck int_curr_symbol currency_symbol
LC_MONETARY
int_curr_symbol="GBP "
LC_MONETARY
currency_symbol="£"
ian@attic-u16:~$ LC_MONETARY=en_ZA.UTF8 locale -ck int_curr_symbol currency_symbol
LC_MONETARY
int_curr_symbol="ZAR "
LC_MONETARY
currency_symbol="R"

C ロケール

C (POSIX) ロケールは、プログラムやシェル・スクリプトで頻繁に使用する基本ロケールを規定します。C プログラムでは、これがデフォルトのロケールです。ローカリゼーションが不要な場合、このロケールを使用すれば、プログラムまたはスクリプトでローカリゼーションを懸念することなく、よく知られている環境を使用することができます。スクリプトとプログラムでは、いずれも必要に応じて他のロケールを設定することもできます。

追加の言語サポート

ほとんどのシステムの初期インストールでは、サポートする言語は 1 つのみです。パッケージをシステムに追加すると、システムの言語設定に基づいて、それらのパッケージによって言語固有のコンポーネントが追加されます。実行しようとしている操作に対応する言語サポートがシステムに欠けている場合は、おそらくエラー・メッセージが表示されて、あらゆる出力がシステムの言語で表示されることになります。リスト 8 に、英語とフランス語の両方で、曜日の名前とその省略形をリストアップする方法を示します。

リスト 8. 曜日の名前のリストアップ方法
ian@attic-u16:~$ locale -ck day abday
LC_TIME
day="Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday"
LC_TIME
abday="Sun;Mon;Tue;Wed;Thu;Fri;Sat"
ian@attic-u16:~$ LC_ALL=fr_FR.UTF8 locale -ck day abday
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LC_TIME
day="Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday"
LC_TIME
abday="Sun;Mon;Tue;Wed;Thu;Fri;Sat"

ご覧のように、このサーバーにはフランス語のサポートがインストールされていないようです。そこで、Ubuntu システムと Fedora システムのそれぞれに、追加の言語サポートをインストールする方法を説明します。

Ubuntu には、特定の言語に必要なパッケージを調べるために使用できる check-language-support プログラムが用意されています。引数を使用しなければ、このプログラムはシステム上にない言語サポートを識別します。リスト 9 に、いくつかの例を記載します。

リスト 9. Ubuntu 上での欠落している言語パッケージの検出方法
ian@attic-u16:~$ check-language-support
gimp-help-en hunspell-en-au hunspell-en-ca hyphen-en-gb libreoffice-help-en-gb 
libreoffice-l10n-en-gb libreoffice-l10n-en-za mythes-en-au thunderbird-locale-en-gb
ian@attic-u16:~$ check-language-support -l en_US
gimp-help-en
ian@attic-u16:~$ check-language-support -l fr
firefox-locale-fr gimp-help-fr hunspell-fr hyphen-fr language-pack-fr language-pack-gnome-fr 
libreoffice-help-fr libreoffice-l10n-fr mythes-fr thunderbird-locale-fr wfrench

check-language-support の出力を apt-get への入力として使用することで、必要なパッケージをインストールできます。リスト 10 に、フランス語に必要なパッケージをインストールする方法を示します。

リスト 10. apt-get を使用したフランス語の言語サポートのインストール方法
ian@attic-u16:~$ sudo apt-get install $(check-language-support -l fr)
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  gimp-help-common hunspell-fr-classical language-pack-fr-base
  language-pack-gnome-fr-base
Suggested packages:
  hunspell libreoffice-grammarcheck-fr
The following NEW packages will be installed:
  firefox-locale-fr gimp-help-common gimp-help-fr hunspell-fr
  hunspell-fr-classical hyphen-fr language-pack-fr language-pack-fr-base
  language-pack-gnome-fr language-pack-gnome-fr-base libreoffice-help-fr
  libreoffice-l10n-fr mythes-fr thunderbird-locale-fr wfrench
0 upgraded, 15 newly installed, 0 to remove and 6 not upgraded.
Need to get 41.6 MB of archives.
After this operation, 115 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
 ...
Setting up language-pack-fr-base (1:16.04+20160627) ...
Generating locales (this might take a while)...
  fr_BE.UTF-8... done
  fr_CA.UTF-8... done
  fr_CH.UTF-8... done
  fr_FR.UTF-8... done
  fr_LU.UTF-8... done
Generation complete.
Setting up language-pack-gnome-fr-base (1:16.04+20160627) ...
Processing triggers for dictionaries-common (1.26.3) ...
Processing triggers for bamfdaemon (0.5.3~bzr0+16.04.20160824-0ubuntu1) ...
Rebuilding /usr/share/applications/bamf-2.index...

フランス語の言語サポートがインストールされたので、曜日の名前とその省略形を表示できます (リスト 11)。

リスト 11. フランス語での曜日の名前を表示する方法
ian@attic-u16:~$ LC_ALL=fr_FR.UTF8 locale -ck day abday
LC_TIME
day="dimanche;lundi;mardi;mercredi;jeudi;vendredi;samedi"
LC_TIME
abday="dim.;lun.;mar.;mer.;jeu.;ven.;sam."
i

Fedora は言語メタ・パッケージを使用して、特定の言語の言語サポートをインストールします。例えば、langpacks-es はスペイン語の言語サポート用メタ・パッケージです。リスト 12 に、Fedora 25 システム上で、dnf を使用してスペイン語の言語パッケージをインストールする例を記載します。これよりも古いシステムでは、dnf ではなく、yum を使用する必要があります。

リスト 12. dnf を使用した、スペイン語の言語サポートのインポート方法
[root@atticf25 ~]# dnf install langpacks-es
Last metadata expiration check: 0:06:08 ago on Wed May 31 22:16:08 2017.
Dependencies resolved.
================================================================================
 Package                        Arch    Version                  Repository
                                                                           Size
================================================================================
Installing:
 autocorr-es                    noarch  1:5.2.7.2-3.fc25         updates  181 k
 glibc-langpack-es              x86_64  2.24-4.fc25              updates  411 k
 gnome-getting-started-docs-es  noarch  3.22.0-1.fc25            fedora    10 M
 hunspell-es                    noarch  1:0.7-6.fc24             fedora   251 k
 hyphen-es                      noarch  0.20110222svn-8.fc24     fedora    16 k
 langpacks-es                   noarch  1.0-8.fc25               fedora   8.5 k
 libreoffice-langpack-es        x86_64  1:5.2.7.2-3.fc25         updates  7.3 M
 man-pages-es                   noarch  1.55-26.fc25             fedora   1.6 M
 mythes-es                      noarch  0.20150304-4.fc24        fedora   710 k

Transaction Summary
================================================================================
Install  9 Packages

Total download size: 21 M
Installed size: 49 M
Is this ok [y/N]: y
Downloading Packages:
(1/9): langpacks-es-1.0-8.fc25.noarch.rpm        27 kB/s | 8.5 kB     00:00    

...

Installed:
  autocorr-es.noarch 1:5.2.7.2-3.fc25                                           
  glibc-langpack-es.x86_64 2.24-4.fc25                                          
  gnome-getting-started-docs-es.noarch 3.22.0-1.fc25                            
  hunspell-es.noarch 1:0.7-6.fc24                                               
  hyphen-es.noarch 0.20110222svn-8.fc24                                         
  langpacks-es.noarch 1.0-8.fc25                                                
  libreoffice-langpack-es.x86_64 1:5.2.7.2-3.fc25                               
  man-pages-es.noarch 1.55-26.fc25                                              
  mythes-es.noarch 0.20150304-4.fc24                                            

Complete!

これで、スペイン語のロケールを使用できるようになりました。一例として、リスト 13 にスペイン語の曜日の名前とその省略形を表示する方法を示します。

リスト 13. スペイン語の曜日の名前とその省略形
[ian@atticf25 ~]$ LANG=es_ES.UTF8 locale -ck day abday
LC_TIME
day="domingo;lunes;martes;miércoles;jueves;viernes;sábado"
LC_TIME
abday="dom;lun;mar;mié;jue;vie;sáb"

永続的なロケールの変更

ログインするたびに常に特定の言語またはロケール設定を使用したいとしたら、.bashrc プロファイル内で LANG、LANGUAGE、LC_ALL、あるいは個々の LC_* 設定を構成します。当然、これらの設定を構成する前に、該当する言語サポート・パッケージがインストール済みでなければなりません。

システムのデフォルトとして使用される言語を変更するには、必要な言語パッケージをインストールしてから、localectl コマンドを使用して、デフォルトのシステム・ロケール設定を変更します。変更できるのは、コンソールまたは X11 ターミナル向けに使用される言語、LC_* 設定、またはキーマップです。これらの設定はログイン前に使用され、設定をオーバーライドしていないユーザーに適用されます。

コード・ページ間の変換

初期のコンピューターは他のコンピューターと通信することはなく、コンピューターの製造元はそれぞれ独自の方法で文字を表現していました。そんな中、共通の情報交換言語にすることを目的として 1963 年に情報交換標準コード (ACSII) がリリースされました。けれども ASCII では127 文字しか表現されていないため、英語以外の言語ではそれほど役に立ちませんでした。ISO などの標準化機構やコンピューター製造元はさまざまなコード・ページを採用していたことから、あるシステム上で特定のコード・ページを使用して作成されたドキュメントは、必ずしも別のシステム上で使用できるとは限りませんでした。そのようなドキュメントを別のシステム上で使用するには、そのシステムが同じコード・ページまたは互換性のあるものをサポートしていなければなりませんでした。

西欧諸国で広く使用されている標準には、ISO-8859-1 もあります。ISO-8859-1 は Windows コード・ページ 1252 と同様ではあるものの、まったく同じというわけではありません。ISO-8859-1 は、最初の 127 文字が ASCII と同じように符号化された、8 ビットの符号化形式です。ISO-8859-1 は多数の西洋言語をそれなりにサポートしていますが、対処していない文字や記号 (句読点など) があります。

Unicode は、ユニコード・コンソーシアムによって開発された最近の符号化標準です。その目的は、世界中の人々が任意の言語でコンピューターを使用できるようにすることにあります。Unicode は当初 16 ビットの符号化形式でしたが、1996 年 7 月からは U+0000 ~ U+10FFFF の範囲内の文字を符号化するようになっているため、少なくとも 21 ビットのコード・スペースが必要です。共通して使用されている符号化形式には、以下の 3 つがあります。

  • UTF-8: 1 個から 4 個の 8 ビット・バイトを使用して各文字を表現します。0 ~ 127 の範囲の文字は、ASCII と同じ符号化形式を使用して 1 バイトで表現されます。
  • UTF-16: 1 個または 2 個の 16 ビット単位を使用して各文字を表現します。
  • UTF-32: 1 個の 32 ビット単位を使用して各文字を表現します。

このチュートリアルでこれまで記載した例ではすべて UTF-8 符号化形式を使用していますが、locale -a の出力には fr_BE.iso88591 などといった他の選択肢も示されています。

ある文字符号化形式を別の文字符号化形式に変換するには、iconv プログラムを使用します。当然のことですが、大きな文字セットを小さい文字セットに変換すると、変換は正しく行われません。この問題については、無視するか、あるいは正しく変換されない文字表記をそれに近い別の文字による表記に移す (翻字) という選択肢があります。翻字では、文字のアクセント記号が省略されたり、サポートされていない通貨記号が短縮名で置き換えられたりします (例えば、ユーロ記号が EUR で置き換えられます)。

リスト 14 に、UTF-8 を ASCII に変換する際の翻字による出力と無効な文字を無視する場合の違いを示します。最初の例では一部の文字からアクセント記号やセディーユが削除され、2 つの文字が一般的な代替表記に移されています。2 番目の例では、限られた ASCII 文字セットではテキストに含まれる文字の多くを表現できないため、テキストの大部分が失われています。

リスト 14. UTF-8 から ASCII への変換
ian@attic-u16:~$ echo abc ß α € àḃç | iconv -f UTF-8 -t ASCII//TRANSLIT
abc ss ? EUR abc
ian@attic-u16:~$ echo abc ß α € àḃç | iconv -f UTF-8 -t ASCII//IGNORE
abc    
iconv: illegal input sequence at position 22

上記と同じ例を ASCII ではなく ISO-8859-1 を使用して試してみると、出力にいくつかの奇妙な文字が現れることになります。リスト 15 の例では、ファイルに取り込んだフランス語のエラー・メッセージを使用しています。このファイルを ISO-8859-1 に変換してから UTF-8 に戻すと、この 2 つの符号化形式の違いと、この例ではデータが失われないことがわかります。

リスト 15. データが失われない変換の例
ian@attic-u16:~$ LANGUAGE=fr_FR ls no-such-file 2>ic-utf8
ian@attic-u16:~$ cat ic-utf8
ls: impossible d'accéder à 'no-such-file': Aucun fichier ou dossier de ce type
ian@attic-u16:~$ iconv -f ISO-8859-1 -t UTF-8 -o ic-utf8 ic-8859 
ian@attic-u16:~$ iconv -f ISO-8859-1 -t UTF-8 -o ic-utf8-out ic-8859 
ian@attic-u16:~$ ls -l ic-*
-rw-rw-r-- 1 ian ian 79 May 31 17:22 ic-8859
-rw-rw-r-- 1 ian ian 81 May 31 17:23 ic-utf8
-rw-rw-r-- 1 ian ian 81 May 31 17:24 ic-utf8-out
ian@attic-u16:~$ diff ic-utf8 ic-utf8-out
ian@attic-u16:~$ diff -q ic-8859 ic-utf8
Files ic-8859 and ic-utf8 differ

タイムゾーンの設定と環境変数

言語と言語関連の設定と同じく、タイムゾーンの設定を構成する必要がある場合もあります。システムにはハードウェア・クロックがあり、システムは起動時に十中八九その時刻設定をネットワーク・タイム・プロトコル (NTP) サーバーと同期します。企業が独自の NTP サーバーやサーバー・プールを保持する場合もあれば、pool.ntp.org (大規模なタイム・サーバーのクラスター) などのパブリック・サーバーを使用する場合もあります。

数百万台のコンピューターやアプライアンス全体で時刻を同期できるようにするには、連携する時間標準が必要です。この標準は、協定世界時 (UTC) と呼ばれています。さらに、UTC と現地時刻との時差を測る基準も必要です。地球は 24 時間で 1 回転するため、タイムゾーンは一般に 1 時間単位の幅を持ちます。例えば、米国の東部標準時は UTC より 5 時間遅れています (UTC-5 と表記)。一部の地域 (南オーストラリアなど) では 1 時間ではなく 30 分のオフセットを使用しています。

グリニッジ標準時 (GMT) は UTC と同じ時間ですが、標準時間ではなく、ブリテン諸島やその他の場所で使用されているタイムゾーンです。

現在の時刻と日付の情報を表示するには、date コマンドを使用します。出力形式には複数の選択肢があるだけでなく、例えばスクリプトを作成する際など、特定の目的に応じて出力形式をカスタマイズすることもできます。リスト 16 に、いくつかの例を記載します。

リスト 16. date コマンドの使用
ian@attic-u16:~$ # Date and time in my system format
ian@attic-u16:~$ date
Wed May 31 18:46:24 EDT 2017
ian@attic-u16:~$ # Date and time in ISO 8601 format
ian@attic-u16:~$ date --iso-8601
2017-05-31
ian@attic-u16:~$ # Date and time in RFC 2822 format
ian@attic-u16:~$ date --rfc-2822
Wed, 31 May 2017 18:48:27 -0400
ian@attic-u16:~$ # UTC Date and time
ian@attic-u16:~$ date -u
Wed May 31 22:49:21 UTC 2017
ian@attic-u16:~$ # Date and time at 09:00 next Friday
ian@attic-u16:~$ date --date='09:00 next Fri'
Fri Jun  2 09:00:00 EDT 2017
ian@attic-u16:~$ # What day is today?
ian@attic-u16:~$ date "+%A"
Wednesday

timedatectl コマンドは、前に使用した localectl コマンドと幾分似ていて、引数なしで使用すると現在のステータスが表示されます (リスト 17 を参照)。

リスト 17. 日時情報の表示
ian@attic-u16:~$ timedatectl
      Local time: Wed 2017-05-31 19:04:09 EDT
  Universal time: Wed 2017-05-31 23:04:09 UTC
        RTC time: Wed 2017-05-31 23:04:09
       Time zone: America/New_York (EDT, -0400)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

タイムゾーンの指定は、タイムゾーンの名前、省略形、時差の 3 つの部分で構成されることに注意してください。タイムゾーンの名前は America/New_York です。このタイムゾーンの一般的な省略形は EDT (Eastern Daylight Time) であり、UTC より 4 時間遅れています。該当するタイムゾーンまたは他の場所のタイムゾーンに対応する正しい形式を確認するには、tzselect コマンドを使用します。この対話型のコマンドでは、2 つの選択項目を順に提示します。リスト 18 に、南オーストラリアのタイムゾーンを確認する方法を示します。

リスト 18. tzselect の使用方法
ian@attic-u16:~$ tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
 1) Africa
 2) Americas
 3) Antarctica
 4) Asia
 5) Atlantic Ocean
 6) Australia
 7) Europe
 8) Indian Ocean
 9) Pacific Ocean
10) coord - I want to use geographical coordinates.
11) TZ - I want to specify the time zone using the Posix TZ format.
#? 6
Please select one of the following time zone regions.
1) Lord Howe Island		      8) Queensland (most areas)
2) Macquarie Island		      9) Queensland (Whitsunday Islands)
3) Tasmania (most areas)	     10) South Australia
4) Tasmania (King Island)	     11) Northern Territory
5) Victoria			     12) Western Australia (most areas)
6) New South Wales (most areas)	     13) Western Australia (Eucla)
7) New South Wales (Yancowinna)
#? 10

The following information has been given:

	Australia
	South Australia

Therefore TZ='Australia/Adelaide' will be used.
Local time is now:	Thu Jun  1 08:41:27 ACST 2017.
Universal Time is now:	Wed May 31 23:11:27 UTC 2017.
Is the above information OK?
1) Yes
2) No
#? 1

You can make this change permanent for yourself by appending the line
	TZ='Australia/Adelaide'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Australia/Adelaide

TZ 環境変数の参照に注目してください。TZ 環境変数を表示しようとすると、この環境変数が設定されていない場合があります。上記の出力を見るとわかるように、使用しているシステムのタイムゾーンとは異なるタイムゾーンを使用する場合は、.profile ファイルにそのタイムゾーンを設定し、ファイルをエクスポートするという方法があります。また、一部の LC_* 変数と同じく、このファイルを使用して date コマンドなどの単一のコマンドを操作することもできます。リスト 19 に、その一例を記載します。

リスト 19. TZ 環境変数の使用方法
ian@attic-u16:~$ date
Wed May 31 19:25:06 EDT 2017
ian@attic-u16:~$ TZ='Australia/Adelaide' date
Thu Jun  1 08:55:08 ACST 2017

システムはいくつかの重要な場所にタイムゾーン情報を維持します。一部のシステム (Ubuntu など) は、システムのタイムゾーンの名前を /etc/timezone 内に維持します。/etc/localtime ファイルは、/usr/share/zoneinfo ディレクトリー内に格納される timezone ファイルへのリンクです。また、/usr/share/zoneinfo ディレクトリーには主なゾーン (アメリカなど) のサブディレクトリーが含まれていて、そのサブディレクトリー内に個々のタイムゾーンのリンクまたはファイルが格納されます。リスト 20 に、Ubuntu システムおよび Fedora システム上での例をいくつか記載します。

リスト 20. システムのタイムゾーン・ファイル
ian@attic-u16:~$ # Ubuntu 16.04 LTS
ian@attic-u16:~$ cat /etc/timezone 
America/New_York
ian@attic-u16:~$ ls -l /etc/localtime 
lrwxrwxrwx 1 root root 36 Dec 23 14:54 /etc/localtime -> /usr/share/zoneinfo/America/New_York
ian@attic-u16:~$ ls -l /usr/share/zoneinfo/America/New_York
lrwxrwxrwx 1 root root 13 Dec  7 05:59 /usr/share/zoneinfo/America/New_York -> ../posixrules

ian@atticf25 ~]$ # Fedora 25
[ian@atticf25 ~]$ ls /etc/timezone
ls: cannot access '/etc/timezone': No such file or directory
[ian@atticf25 ~]$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 38 Apr 26 18:09 /etc/localtime -> ../usr/share/zoneinfo/America/New_York
[ian@atticf25 ~]$ ls -l /usr/share/zoneinfo/America/New_York
-rw-r--r--. 3 root root 3545 Mar 27 22:18 /usr/share/zoneinfo/America/New_York

システムの日付またはタイムゾーンを変更する必要がある場合は、tmedatectl コマンドを使用します。使用できるオプションとコマンドについての詳細は、man ページを参照してください。NTP 同期の有効化や foo などの操作を実行できるだけでなく、システムのリアル・タイム・クロックを更新したり使用したりすることもできます。

これで、ローカリゼーションとタイムゾーンの設定についての説明を終わります。


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=1054423
ArticleTitle=Linux の 101 試験対策: ローカリゼーションと国際化対応
publish-date=12072017