IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

WSLで始めるUbuntu

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第11回 ロケールとプロンプト変数について知ろう (宮崎悟) 2019年8月

前回は定義済みのシェル変数について説明しました。今回はその変数の中でもlocaleとプロンプト変数PS1~4について説明しようと思います。

ロケールとは

ロケールは、localization(コンピュータソフトウェアを現地語環境に適合させること。l10nと書くこともあります)を実現させるためのOSの仕組みです。WSLでも各種言語環境に変更させることができます。日本語環境に設定する手順については第3回で説明したと思います。

現在のロケール設定を確認するには、locale コマンドを使用します。

$ locale
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE=ja_JP.UTF-8
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME=ja_JP.UTF-8
LC_COLLATE=ja_JP.UTF-8
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES=ja_JP.UTF-8
LC_PAPER="ja_JP.UTF-8"
LC_NAME=ja_JP.UTF-8
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT=ja_JP.UTF-8
LC_IDENTIFICATION=ja_JP.UTF-8
LC_ALL=

各変数意味は以下のとおりです。

シェル変数 説明
LANG LC_*より優先されるロケール
LANGUAGE 「:」 区切りのロケールのリスト
LC_CTYPE パス名展開、パターンマッチに使用されるロケールを指定
LC_NUMERIC 数字のフォーマットに使用するロケールカテゴリを指定
LC_TIME 日付表示の際のロケールを指定
LC_COLLATE パス展開結果をソート順序を決めるためのロケールを指定
LC_MONETARY 金額に関連する数値の表示方法を指定
LC_MESSAGES $の後に続く""で囲まれた文字列のロケールを指定
LC_PAPER 標準的な紙のサイズの寸法を指定
LC_NAME 人に呼びかける際に使用されるフォーマットを指定
LC_ADDRESS 場所や地理関連の項目の表示に使用されるフォーマットを指定
LC_TELEPHONE 電話サービスで使用されるフォーマットを指定
LC_MEASUREMENT ロケールの測定系(メートル法かフィート単位系か)に関連する設定を指定
LC_IDENTIFICATION ロケールのメタデータに関連する設定を指定
LC_ALL 設定されると、変数LC_* とLANGに優先して使用されるロケール

これらの値については、概ねLC_ALLもしくはLANGで上書きできます。

また、一時的なロケールの変更は以下のようにenvコマンドでLC_ALLなどを環境変数として指定して実行することで可能です。

$ ls -l
合計 0
drwxrwxr-x 1 s-miyaza s-miyaza 4096  4月 27 20:38 fontpatcher
drwxrwxr-x 1 s-miyaza s-miyaza 4096  4月 27 22:28 tmux
$ env LC_ALL=C ls -l
total 0
drwxrwxr-x 1 s-miyaza s-miyaza 4096 Apr 27 20:38 fontpatcher
drwxrwxr-x 1 s-miyaza s-miyaza 4096 Apr 27 22:28 tmux

最初のls -lでは現在のロケールja_JP.UTF-8で、次のenv LC_ALL=C ls -lでは、ロケールをC(基本のロケール)で実行しているため、表記が英語になっている事がわかります。

プロンプト変数

プロンプトとは、bash実行時に表示される文字列です。初期値では、「ユーザ名@ホスト名:ディレクトリ$ 」となっていると思います。これらは、特殊なシェル変数によって設定されます。

変数名 説明
PS1 プライマリのプロンプト文字列
PS2 セカンダリのプロンプト文字列
PS3 select コマンドのプロンプト
PS4 実行トレース中に bash が表示する各コマンド前に出力
PROMPT_COMMAND コマンド列を指定すると、PS1を出す前に毎回コマンドとして実行される
PROMPT_DIRTRIM 0 より大きい値が設定されると、 プロンプト文字列のエスケープシーケンス \w や \Wを展開するときに、ディレクトリがパス名の最後からこの数だけ残る。

プロンプトに設定するものとして、通常の文字列の他にエスケープシーケンスを設定できます。

エスケープシーケンス 説明
\a ASCII のベル文字 (文字コード 07)
\d "曜日 月 日" という形式の日付 (例: "Tue May 26")
\D{format} format が strftime(3) に渡され、 その結果がプロンプト文字列に挿入される。 format が{}(空)の場合には 、 ロケールで指定された時刻表記になる。
\e ASCII のエスケープ文字 (文字コード033)
\h ホスト名のうち最初の「.」までの部分
\H ホスト名
\j シェルによって現在管理されているジョブの数
\l シェルの端末デバイスのベース名 (basename)
\n 改行 (newline)
\r 復帰 (carriage return)
\s シェルの名前。つまり $0 のベース名 (最後のスラッシュ以降の部分)
\t 24 時間制の HH:MM:SS 形式の現在の時刻
\T 12 時間制の HH:MM:SS 形式の現在の時刻
\@ 12 時間制の am/pm 形式の現在の時刻
\A 12 時間制の HH:MM 形式の現在の時刻
\u 現在のユーザのユーザ名
\v bash のバージョン (例: 2.00)
\V bash のリリース。バージョンにパッチレベルを加えたもの (例 : 2.00.0)
\w 現在の作業ディレクトリ。 $HOME の部分はチルダに短縮される<br />変数PROMPT_DIRTRIM の値が適用される。
\W 現在の作業ディレクトリのベース名 $HOME の部分はチルダに短縮される
\! このコマンドの履歴番号
\# このコマンドのコマンド番号
\$ UID が 0 の場合に #、 それ以外の場合は $を表示
\nnn 8進数 nnn に対応する文字を表示
\ バックスラッシュ
\[ 非表示文字のシーケンスの開始。 これを使うと、プロンプト中に端末の制御シーケンスを埋め込むことができます。
\] 非表示文字のシーケンスを終了します。

WSLでのPS1の初期値は、'${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' となっています。

上記のEscapeシーケンスを元にして、好きな文字列をプロンプトに設定することできます。永続的にPS1を指定したい場合は、.bashrc にPS1を記述してください

終わりに

今回は、ロケールの概念とbashのプロンプトについて説明しました。PS2~PS4の使い方については後日説明しようと思います。

次回はエスケープシーケンスについて簡単に説明しようと思います。次回をお楽しみにお待ち下さい。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes