株式会社クリアコード > ククログ

ククログ


Windwos 10のWSLを日常的に活用する:Windowsの補助としてLinuxコマンドを使う

前の記事では、Windows 10 Fall Creators Update以降のWSL(Windows Subsystem for Linux)を日常的に使いやすいようにするための環境整備のポイントをいくつかご紹介しました。これは、「何か作業をするときに、Windows上でLinuxのコマンド体系が使える小窓を開いて、その中でLinuxらしい(Windowsらしくない)やり方で作業する」という使用形態を想定した解説でした。

一方、Windowsアプリを主体として使用する場面でもWSLは活用できます。例えばEmEditorというテキストエディタは任意のアプリケーションを登録して呼び出せますが、ここにWSL経由でLinuxのコマンド列を実行するように設定すれば、EmEditorをLinuxのコマンドやシェルスクリプトで機能強化することができます。

なお、この記事ではWSLの使用手順そのものについては紹介していません。まだ準備が整っていない場合は、前の記事などを参考にまずWSLを有効化し、Ubuntuなどのディストリビューションをインストールしておいて下さい。

WSLの機能を呼び出すためのWindowsのコマンド

WSLを有効化済みの環境では、Windowsのコマンドプロンプトでwslconfigwslという2つのコマンドが使えるようになっています。

wslconfig /listというコマンド列を実行すると、その環境に既にインストール済みのWSL用Linuxディストリビューションの一覧が表示されます。以下は、Ubuntuだけがインストールされた環境での実行結果の例です。

C:\Users\user> wslconfig /list
Ubuntu

インストール済みのディストリビューションの一覧をこの方法で確認した後、wslconfig /s (表示されたディストリビューション名の中の1つ)というコマンド列を実行すると、そのディストリビューションがWSLでの既定のディストリビューションになります。

C:\Users\user> wslconfig /s ubuntu

このように既定のディストリビューションが登録済みの場面では、wslコマンドを実行するとWindows側でのカレントディレクトリに相当するディレクトリをカレントディレクトリとした状態で、WSL上のLinuxディストリビューションのシェル(Bash)を起動できます

C:\Users\user> wsl                  ←Windowsのコマンドプロンプトでwslコマンドを実行
user@ubuntu:/mnt/c/Users/user$      ←カレントディレクトリでWSL上のシェルが起動する
user@ubuntu:/mnt/c/Users/user$ exit
C:\Users\user>                      ←シェルを終了するとコマンドプロンプトに制御が戻る

また、wslコマンドに引数を渡すと、その内容がそのままWSL環境のシェル上で実行されて、すぐにシェルが終了します。つまり、Windowsから直接Linuxのシェルのコマンドを実行できます

C:\Users\user> wsl ls
スタート メニュー    NTUSER.DAT ←WSL上のシェルでのlsの実行結果が出力される
...
C:\Users\user>                 ←その後、すぐにWindowsのコマンドプロンプトに制御が戻る

ただし、この方法で実行できるのはコマンド1つだけです。パイプラインを使った複雑なコマンド列を実行したい場合、あらかじめ組み立てておいたコマンド列をダブルクォートで括って文字列にし、bashコマンドの-cオプションで実行するという工夫をする必要があります。

C:\Users\user> wsl bash -c "echo 'hello' | sed -r -e s/h/H/"
Hello
C:\Users\user>

WindowsアプリケーションからWSLの機能を呼び出す

前述のwslコマンドの実体はC:\Windows\System32\wsl.exeです。外部アプリケーションを呼び出す機能を持ったアプリケーションからこのファイルを実行するようにすれば、WindowsアプリケーションからWSL経由でLinux環境のコマンドを実行する事ができます。

例えばEmEditorというテキストエディタは、無料版での使用においても、「ツール」→「外部ツール」→「外部ツールの設定」で任意のアプリケーションを登録できます。以下は、これを使って選択範囲の文字列をBashのワンライナーで加工する例です。

  • 例1: 選択範囲の文字数を数えてツールチップで表示する
    • タイトル:選択範囲の文字数を数える
    • コマンド:C:\Windows\System32\wsl.exe
    • 引数:bash -c "nkf -w | wc -c"
    • アウトプットバーを使用する:ON
    • 終了時に閉じる:ON
    • 入力:選択テキスト
    • 出力:ツールチップとして表示
    • 出力→エンコード:システム既定(932, shift_jis)
  • 例2: 選択範囲の行数を数えてツールチップで表示する
    • タイトル:選択範囲の行数を数える
    • コマンド:C:\Windows\System32\wsl.exe
    • 引数:bash -c "nkf -w | wc -l"
    • アウトプットバーを使用する:ON
    • 終了時に閉じる:ON
    • 入力:選択テキスト
    • 出力:ツールチップとして表示
    • 出力→エンコード:システム既定(932, shift_jis)
  • 例3: 選択範囲の行をアルファベット順・数値順に並べ替える
    • タイトル:選択範囲の行を並べ替える
    • コマンド:C:\Windows\System32\wsl.exe
    • 引数:bash -c "nkf -w | sort -n | nkf -s"
    • アウトプットバーを使用する:ON
    • 終了時に閉じる:ON
    • 入力:選択テキスト
    • 出力:選択範囲と置換
    • 出力→エンコード:システム既定(932, shift_jis)

「実行ファイルとしてwsl.exeを指定してbash -c "〜"でコマンド列を渡す」という点と、「標準入出力をnkfなどを使って変換して呼び出し元のWindowsアプリに合わせる」という点が重要です。これらの点に気をつければ、gemnpmでインストールされたコマンドなども容易に組み合わせられるため、応用の幅は無限大と言えます。また、ワンライナーで記述するのが大変な処理は、あらかじめWSLの環境にシェルスクリプトを用意しておきそれをC:\Windows\System32\wsl.exe bash "/home/user/script.sh"のように実行するようにしてもよいでしょう。

まとめ

以上、WSLをWindowsアプリケーションの機能強化に使う手順を、EmEditorでの設定を例としてご紹介しました。

gemnpmでインストールできるコマンドの中には、特に明記はされていなくても、LinuxやmacOSの環境のみを想定して作られているという物が度々あります。特に拡張モジュール(バイナリ)を含む物はその傾向が顕著で、Windows上で動作させるにはVisualStudioの導入が必要であるなど、気軽に使えるとは言い難いのが実情です。

しかしWSL上のLinux環境であれば、そのようなコマンドも難なくインストールできます。「Windows上でgemnpmを使う」場面に特有の苦労をしなくてもよくなりますので、使用にあたってのハードルが大きく下がりますので、今まで「便利そうなコマンドだけど、Windowsじゃ動かないんだよな……」と諦めていた人は、是非一度試してみて下さい。

2017-12-04

«前の記事: Fluentd v0.14.xが安定版になりました 最新記事 次の記事: PGConf.ASIA 2017 - PGroonga 2 – Make PostgreSQL rich full text search system backend! #pgconfasia»
タグ:
年・日ごとに見る
2008|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|