Windows 10に搭載されたLinuxサブシステムにおける、Windowsプログラムとの連携や日本語処理機能を検証する:Windows 10 The Latest(2/3 ページ)
Windows OS上でLinuxプログラムの実行を可能にするWindows Subsystem for Linux(WSL)が正式版になった。その概要やWindowsプログラムとの連携、日本語の扱いなどについて見てみよう。
LinuxとWindows OSのコマンドを組み合わせて使う
WSLの機能は多岐にわたるので、今回はWindowsプログラムとの連携と、日本語処理の扱いについてのみ取り上げることにする。
β版の時は、WSLを利用するためにはbashのウィンドウを開いてLinuxコマンドを実行していた。だが現在のWSLでは、Windows OSの「コマンドプロンプト」上から直接特定のLinuxコマンドを指定して呼び出すことができるし、逆に、WSLのシェルから直接Windows OS側のコマンドを呼び出すこともできる。これにより、LinuxのコマンドとWindowsのコマンドをパイプで連結して連続実行させるといった処理が可能になっている。
●コマンドプロンプトからWSLを起動する
最初は、Windows OSのコマンドプロンプトからLinuxのコマンドを呼び出す方法を見てみよう。
Linux側のコマンドを呼び出すためには、まずインストールされているディストリビューションの一覧を知る必要がある。
インストール済みのディストリビューションの一覧は、「wslconfig /list」コマンドで確認できる。そこに表示されている名前を使って、例えば「ubuntu」というコマンドを実行すると、Ubuntuディストリビューションのシェルを起動できる。単に「wsl」とだけ入力すると、一覧表示で「(既定)」となっているディストリビューションが起動できる(1つしかインストールしていない場合はそれが呼び出される)。
WSL環境の起動方法
WSL環境は、Windows OSのコマンドプロンプトから直接起動することもできる。インストールされているディストリビューション名を調べたり、起動コマンド名を調べたりするにはwslconfigコマンドを使う。
●相互呼び出しのパターン1:WindowsのコマンドプロンプトからWSLのコマンドを呼び出す
コマンドプロンプトからWSLのコマンドを呼び出すには、wslに続けて、Linuxのコマンド(とパラメーター)を指定する。すると、現在のカレントフォルダ(次の例ではC:\)が、WSL実行開始時のカレントディレクトリ(/mnt/c)に設定された状態でLinuxのコマンドが実行される(以下、全てUbuntu上での実行例)。
WindowsからLinuxのコマンドを呼び出す
lsbに続けてLinuxのコマンドとパラメーターを指定すると、デフォルトのLinuxディストリビューション(=「wslconfig /list」コマンドで確認可能)によって、指定されたコマンドが実行される。
実行開始時のカレントディレクトリをユーザーのデフォルト(ホーム)にしたい場合は、「wsl ~ ls -lsa」のように、先頭に「wsl ~ 〜」を指定する。
デフォルト以外のディストリビューションで実行したい場合は、「ubuntu -c ls /etc」「opensuse-42 -c cat /etc/os-release」のように、ディストリビューション名(「wslcoinfig /list」で取得可能)と-cオプションを指定する。
●相互呼び出しのパターン2:WSLからWindowsのコマンドを呼び出す
次はWSL側からWindows OSのコマンドを呼び出してみよう。
Windows OSで利用できるコマンドは、もともとはUNIXにあったものをWindows OS向けにしたものが多い。そのため、単にコマンド名だけを入力すると、Windows OS側のコマンドか、WSL側(Linux側)のコマンドか判断がつかない。例えばsortやfindやmoreなどが相当する。また独立した実行プログラムではないが、「dir」のようなコマンド名もLinux側と衝突している。
この問題を解決するため、WSLからWindows OS側のコマンドを呼び出す場合は、次のようなルールを採用している。
- 実行ファイルの拡張子まで指定すること(例:単に「find」でなく、「find.exe」とする)
- ファイルシステム上での大文字/小文字の違いを正しく指定すること(例:「robocopy.exe」ではなく実際のファイル名である「Robocopy.exe」としている。Windows OSでは大文字/小文字の違いは無視されるが、WSLでは無視されない)
- コマンドプロンプト(cmd.exe)の内部コマンド(独立した実行プログラムファイルとして用意されていないコマンド)を実行したい場合は、「cmd.exe /c dir」のように「cmd.exe /c 〜」を前に付けること
- PATH環境変数に登録されていない場所にあるコマンドの場合は、フルパスで表記する(例:「/mnt/c/MyCommand/mycommand.exe」のようにする)
以下に実行例を示す。
WSLを起動すると、Windows OS環境にあったPATH環境変数の値がWSL側にも引き継がれるようになっている。そのため、コマンドプロンプト上で起動できたコマンドは、フルパス指定にしなくても、そのままWSL側のbash上でも実行できる。
PATH環境変数のの引き継ぎ
Windows OS側で定義されていたPATH環境変数の値はWSL側に引き継がれている。そのため、Windows OS側のコマンドもフルパスではなく、ファイル名だけで起動できる。whichはコマンドの場所(フルパス)を表示するコマンド。
以上の機能を使うと、Windows OSのコマンドとLinuxのコマンドをパイプで接続して処理したり、リダイレクトでLinuxもしくはWindows OS上のファイルへアクセスしたりすることも可能である。
ちなみにWindowsのGUIのプログラムを呼び出すことも可能である(例「notepad.exe」を実行すればメモ帳を起動できる)。Linux環境からでも使い慣れたWindowsのGUIのエディタを起動できるので便利だ(ただし拡張子まで含めてプログラム名を指定しなければならないが面倒だが)。
Copyright© Digital Advantage Corp. All Rights Reserved.