このページの本文へ

Windows Info 第77回

Windows Subsystem for LinuxのBashの初期設定を行なう

2016年12月04日 10時00分更新

文● 塩田紳二 編集● ASCII.jp

  • この記事をはてなブックマークに追加
  • 本文印刷

 Windows Subsystem for Linux(WSL)ことBash on Windowsだが、今回は初期設定の流れをみていきながら、デフォルトの設定がどうなっているのかを調べることにしよう。

 その前に注意を1つ。Windows側から見て、Linuxのファイルシステムは、「%userprofile%\appdata\local\lxss\」以下にあることは以前解説した

 これはVolFSと呼ばれ、WindowsのフォルダをWSLに対してストレージ上のファイルシステムのように見せている。ただ、Windows側からすると特殊な状態になるため、システム属性が付けられていて、通常は見えない状態になっている。そのためWindows側からはここを直接編集してはならない。

 なぜなら、ここはLinux側が管理するファイルシステムとなっているため、Linux側からは見ることができないWindowsのアプリケーションなどから書き込みなどを行なうと、Linux側で想定している状態と齟齬をきたす恐れがあるからだ。

 原則VolFS内は、Linux側からのみアクセスするようにして、どうしてもWindows側でファイルを編集したい場合、Linux側からDevFS(Linux側の/mnt/c以下など)にコピーしてからファイルをWindows側アプリケーションでアクセスする必要がある。

bashの初期設定を行なう

 bashは、Linuxの多くのディストリビューションで標準的に使われている「シェルプログラム」だが、他のシェルプログラムに切り替えることも可能だ。実際にシェルプログラムはたくさんある。

 このため、シェルプログラムは、オリジナルの/bin/shの起動方法をベースにしたシェルプログラムに依存しない設定部分と、個々のシェルプログラムで固有の設定を持つ。原則としてbashなど、シェルプログラムの名前を含むものは、シェルプログラム固有の設定ファイルである。

bashの起動からログイン、そしてログアウトまでに自動的に実行するスクリプト。profileを名前に持つものは、ユーザー設定を意味し、シェルプログラムに関係なく実行される。bashを名前に含むものは、bashの初期設定ファイル

 上の図はbash起動時の設定ファイルを示したものだ。ただし、WSLを含め、Linuxのディストリビューションによっては、すべてのファイルが用意されていないことがある。ファイルが存在しないこと自体は問題ではないが、一部のシェルスクリプトファイルは、後続するファイルを呼び出しているため、ユーザーが不用意にファイルを削除してしまうと、この依存関係が崩れてしまうので注意が必要だ。

 そのため原則として、/etc/以下に置かれているものは、システム全体で共有するファイルなので、できれば、手をつけずに、なるべくユーザーディレクトリ以下のものだけを編集するようにすべきだ。

 とりあえず、ファイルを見るだけならば、moreコマンドで引数にファイルを指定すれば、表示が行える。たとえば、「/etc/profile」を表示させるなら「more /etc/profile」と入力してエンターキーを押せばよい。じっくりファイルを見たいのであれば、エディタを使うべきだ。

 Linuxで設定を変更するのは、主にテキストファイルを編集することで行う。このため、エディタになれておくのは必須といえる。とはいえ、標準的なviやemacsなどそれぞれ高機能で敷居は低くないので、これについては別途解説とさせていただきたい。

 とりあえず、簡単にファイルを編集する場合には、キーコマンドの説明が標準で表示されるnanoを使うといいだろう。viやemacsに比べるとさほど機能は高くないが、nanoは、基本的な機能キーを常に表示するため、使い方を理解していなくても、利用することが可能だ。

nano自体は高性能ではないが、画面下にコマンドの説明を表示するため、初めてでもなんとか利用できるエディタだ

 もう1つ、シェルスクリプトを見るときに注意するのが「ドットソース」コマンドだ。bashなどの設定ファイルは、bashが実行するプログラムになっている。これをbashコマンドの引数にして実行してしまうと、新しくbashのプロセスが起動されて、そこでスクリプトが実行されるだけで、起動したbashプロセスが終了すると、元のbashには、実行の結果が残らない。実行中のbash(シェル)にスクリプトファイルを実行させてその結果を反映させるためには、シェル組み込みのsourceコマンドを使う。

 なお、オリジナルの/bin/shでは、これが「.」というコマンドになっていたため、sourceコマンドのことを「ドットソース」と呼ぶ。profileなどのスクリプトでも「.」を使った記法があるので、これに注意されたい。原則、さきほどの図のスクリプトは、すべて「ドットソース」で実行され、起動中のシェルに結果が反映されている。

 なお、シェルでは、カレントディレクトリを「.」で表現するので、これとドットソースを混同しないように注意する。

WSLにおけるbashの初期設定

 まずは、/etc/にあるファイルから見ていこう。/etcにあるのは、

/etc/profile
/etc/bash.bashrc
/etc/profile.d/*

だ。最初に実行されるのは、/etc/profileだ。

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).


if [ "$PS1" ]; then
 if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
  # The file bash.bashrc already sets the default PS1.
  # PS1='\h:\w\$ '
  if [ -f /etc/bash.bashrc ]; then
   . /etc/bash.bashrc
  fi
 else
  if [ "`id -u`" -eq 0 ]; then
   PS1='# '
  else
   PS1='$ '
  fi
 fi
fi

# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.

if [ -d /etc/profile.d ]; then
 for i in /etc/profile.d/*.sh; do
  if [ -r $i ]; then
   . $i
  fi
 done
 unset i
fi

リスト中「#」は注釈を示す。最初の部分は、シェルプログラムがbashかどうかを判断して/etc/bash.bashrcを実行するかどうかを判断している。後半部分(途中の注釈行からあと)は、/etc/profile.d内のスクリプトを実行するためのもの

 そもそも「profile」を名前の一部に持つスクリプトは、シェルの設定というよりも、ユーザーの環境設定のためのスクリプトとして使われている。

 このスクリプトは、/bin/shを前提にして記述され、シェルプログラムが変わっても同じように実行されることが想定されている。このため、ここにシェルプログラム固有の表記や機能を入れるべきではない。なお、WSLでは、このファイルは

/etc/bash.bashrcの起動
/etc/profile.d以下の*.shファイルのうち実行許可のあるものをすべて実行

という2つの仕事をしているだけだ。原則、このファイルを編集する必要はなく、ここから/etc/bash.bashrcが起動されていること、/etc/profile.d以下のスクリプトは、実行許可があるかどうかで起動されるかどうかが決まっていることを理解しておくだけでいい。

 ここでのポイントは、"["は、testコマンドのことだという点。つまり、中程にある「[ -d /etc/profile.d ]」というところは、「test -d /etc/profile.d」と同じ意味なのである。

 testコマンドについてはmanコマンドやインターネット検索で調べれば細かいことがわかるのでここでは解説しないが、-dは、後続するパラメーターがディレクトリかどうかを判定する動作を指定するものだ。つまり、ここで/etc/profile.dというディレクトリがあるかどうかを判定しているのである。

 次は/etc/bash.bashrc」だが、これは、bashコマンドのシステム全体で共通の設定を行なうスクリプトだ。Linuxはマルチユーザーシステムなので、複数のユーザーがログインして利用する可能性があるが、/etc/にあるbash.bashrcは、そのすべてに共通する設定をするファイルだ。

 システムで必要な設定を管理者があらかじめ行なっておくなどに使う。なお、場合によっては、特殊なサービスを実現するために専用のユーザーが作られることもあり、もしbashを使うのであれば、そのユーザーも/etc/bash.bashrcを起動時に読み込む可能性があることにも注意したほうがよい。

 この/etc/bash.bashrcは、ユーザーがコマンドとして直接bashを起動した場合のみ読み込まれる。ユーザーからのコマンドを受け付ける状態にあるシェルを「インタラクティブシェル」という。このスクリプトはインタラクティブの時のみに読み込まれ、そうでないときには読み込まれない。その区別は、PS1というシェル変数が定義されているかどうかで判断されている。

 もしシェルがインタラクティブだった場合、PS1という変数が定義されている。逆にインタラクティブでない場合、PS1という変数は定義されていない。これを使って以後の処理を行うかどうかを/etc/bash.bashrcの7行目で判断している。

 そのあと、19行目でPS1を定義しており、/etc/bash.bashrcをここまで実行したシェル(これがログインシェル)から直接bashコマンドで起動したシェルは、すべてPS1を引き継ぐためインタラクティブシェルとなる。なお、このPS1は、コマンドのプロンプトを定義しているが、これを変更したい場合には、/etc/bash.bashrcを編集せずに、ユーザーのホームディレクトリにあるファイルで編集する。

 また、この/etc/bash.bashrcは、bashの動作オプションを組み込みコマンドのshoptで指定している(11行目)。shoptは、bashの動作を指定するオプション(フラグ)を設定するbashの組み込みコマンド。現在のWSLでは、checkwinsizeのみ設定されている。これは、ターミナルウィンドウ内などで、ウィンドウサイズに追従するためのもの。コマンドの実行後にウィンドウサイズをチェックし、シェル変数$LINESと$COLUMNSを更新する。

 /etc/bash.bashrcでは、ほかの設定も行っているが、コマンドが見つからない場合に表示されるメッセージの設定などであり、あまり気にする必要はない。

 /etc/profile.dは、前述のようにディレクトリで複数のコマンド(拡張子がshのファイル)があり、このうち実行許可のあるものだけが/etc/profileから実行される。/etc/profile.dは、必要なプログラムが初期設定するので、通常は、あまり気にしなくてよい。

 さて、次回は、ローカルにある起動関係のファイルを解説する。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン