BUWの使用環境を強化する

本連載はConEmuを紹介してきたが、海外ではさまざまなアプローチでBUW(Bash on Ubuntu on Windows)の使用環境を強化している。その1つがGore Liu氏作の「wsl-terminal」だ。WSL(Windows Subsystem for Linux)向け端末(ターミナル)エミュレーターとして、minttywslbridgecbwinを組み合わせたパッケージである。

まずは順番に紹介しよう。minttyはSimon Tatham氏らが開発するSSHクライアント「PuTTY」を基に開発中のターミナルエミュレーターだ。wslbridgeはSSHライクにTCPソケット経由でWSLに接続するCygwinのプログラムである。そしてcbwinはWSLからデスクトップアプリを起動するツールだ。minttyを除けば、WSLの未完成な部分を補う形で開発されたものばかり。改めてBUWもしくはWSLに対する注目度の高さと、オープンソースコミュニティの力を感じさせる。

wsl-terminalの導入はGitHubから最新版(執筆時点ではバージョン0.5.1)をダウンロードし、任意のフォルダーに展開。「open-wsl.exe」を実行すると展開したフォルダーをカレントフォルダー(ディレクトリ)としてminttyが起動する。psコマンドを実行するとBUW上でminttyからWSLに接続するためのブリッジが起動していることが確認できた。

「wsl-terminal」を展開した状態

「open-wsl.exe」を実行するとBUWが起動する

このまま使用すると日本語が間延びした状態になってしまうため、フォント設定を変更する。Optionダイアログが起動したら、<Text>を開いてフォント設定を変更しよう。選択できるのは非プロポーショナルフォントに限られるので、MSゴシックやIPAゴシックなどを選択する。<Looks>ではテーマ設定や個別の配色指定が行えるため、必要に応じて好みの設定を施してほしい。なお、既に他の環境でminttyをお使いの場合は設定ファイルである「minttyrc」を展開したフォルダー下の「etc」にコピーしてもよい。

minttyの設定を変更するには、[Alt]+[スペース]キーを押すなどしてアプリケーションメニューを開き、<Options>をクリックする

<Text>→<Select>ボタンと順にクリックし、任意の日本語フォントを選択する

こちらはIPAゴシックを選択した状態。日本語が正しく表示される

次は「tools/add-open-wsl-here-menu.js」を実行する。ファイル名からも分かるように、エクスプローラーのコンテキストメニューにopen-wsl.exeを呼び出す<Open WSL Here>項目をレジストリエントリーで追加するWSHスクリプトだ。これでopen-wsl.exeを起動するとカレントフォルダーになる問題は解決できる。ちなみに同項目を削除する場合は、「tools/remove-open-wsl-here-menu.js」を実行すれば、レジストリエントリーが削除される。

「tools/add-open-wsl-here-menu.js」をダブルクリックで実行する

これでエクスプローラーのコンテキストメニューに<Open WSL Here>が加わる

<Open WSL Here>をクリックすると、開いたフォルダーをカレントディレクトリとしてopen-wsl.exeが起動する

「run-wsl-file.exe」はWindows 10からスクリプトを実行するためのラッパーだ。作者の説明によれば、bashのシェルスクリプトである拡張子「.sh」以外にも、Pythonの拡張子「.py」、Perlの拡張子「.pl」、PHPの拡張子「.php」を関連付けられる。筆者が試したところ、Windows 10上の秀丸でUTF-8/改行コードLFで作成したシェルスクリプトもそのまま実行できるため、vimに慣れてない利用者には大きなメリットとなりそうだ。ちなみにwsl-terminalには、BUW上のvimを直接呼び出す「vim.exe」も用意している。

任意のシェルスクリプトをダブルクリックし、<その他のアプリ>→<このPCで別のアプリを探す>と順にクリックする

コモンダイアログから「run-wsl-file.exe」をクリックして選択し、<開く>ボタンをクリックする

エクスプローラーからシェルスクリプトをダブルクリックすると、run-wsl-file.exe経由で実行可能になる

最後にcbwinの有効化設定を行おう。基本的に難しい操作は必要とせず、BUW上で「bin/instal_cbwin.sh」を実行するだけだ。これでコンパイル済みバイナリがBUW上の/usr/local/binにコピーされる。次に「etc/wsl-terminal.conf」を開き、「use_cbwin」の値を「1」に変更するだけだ。ただし、筆者が検証していたところ、「wrun: OUTBASH_PORT environment variable not set, and could not read /home/kaz/.config/cbwin/outbash_port」というエラーが発生した。これは、Windows 10の「SSH Server Broker」「SSH Server Proxy」の各サービスが存在しない場合に発生する。筆者は以前各サービスを削除してしまったため、「設定」の<更新とセキュリティ>→<開発者向け>で、<開発者モード>を再選択することで解決した。

vim.exeを起動した状態。既定でNetrwが起動する

「cd bin && sudo ./install_cbwin.sh」と入力して[Enter]キーを押す

「vim etc/wsl-terminal.conf」と入力して[Enter]キーを押し、「use_cbwin=1」に変更する

例えばBUW上ではpingコマンドは実行できないが、「wrun ping 127.0.0.1」と実行した場合、Windows 10のping.exeが起動し、pingを打つことができる

このようにWindows 10の親和性が高いwsl-terminalは、Windows 10上でBashを多用する利用者にとっては、便利に環境構築を行えるパッケージなので、是非1度試してほしい。

蛇足だが、2016年8月31日(現地時間)にMicrosoftがリリースしたWindows 10 Insider Preview ビルド14915では、WSLの改善が加わった。詳しい情報はGitHub上で確認できるが、SO_REUSEADDRやSO_BROADCAST、SOCK_SEQPACKETといったUNIXのソケットを新たにサポートすることで、互換性問題を一歩ずつ改善している。

時間軸でデスクトップを片付ける

さて、前回はデスクトップに散らかったファイルを拡張子別でサブフォルダーに振り分けるシェルスクリプトを紹介したが、そちらの納品したところ、「日時ごとに変更できないか?」と意見された。多くの会社員は出勤関連や日々の提出物など毎日、もしくは週末にまとめて入力していると思うが、その仕組みは千差万別。周りの方々にヒアリングしても、「入力しやすい」という声を耳にすることはない。

雑談がてらに聞いていくと、その日扱った案件を入力しなければならず、日々の業務に追われて入力を怠ると、思い出すだけでも一苦労だとか。筆者はフリーランスとして働いてきた時期が大半を占めるため、ヒアリングした方々の苦労を推し量ることはできないが、この辺りを自動化すれば負担も軽減できるはずだ。

ロジック的には特定のフォルダーを対象に、月ごとのフォルダーを作成。さらに日単位でサブフォルダーを作成すれば可能ではないだろうか。LinuxはWindowsとタイムスタンプ管理方法が異なり、最終アクセス日時を指す「atime」、最終変更日時を指す「mtime」、最終ステータス変更日時を指す「ctime」を備えている。今回はWindowsにおける変更日時=mtimeを元に、ファイルを振り分けることにした。その前提で作成したのが以下のシェルスクリプトである。いつもどおりvimなどで下記の内容を作成し、chmodコマンドで実行権限を付加してほしい。

 #!/bin/bash

 BaseDir="/mnt/c/Users/kaz/Desktop/Test"

 cd $BaseDir
 for File in *; do
    if [ -f "$File" ]; then
        YearStr=`date -r "$File" '+%Y'`
        MonthStr=`date -r "$File" '+%m'`
        DayStr=`date -r "$File" '+%d'`

        mkdir -p $YearStr/$MonthStr/$DayStr
        mv $File -t $YearStr/$MonthStr/$DayStr
    fi
 done

今回は動作内容もシンプルなため、短いシェルスクリプトとなった。なお前回同様、実験環境としてWindows 10のデスクトップフォルダーに「Test」フォルダーを作成し、その上にダミーファイルを用意して検証を行っている。そのため、4行目にある変数「BaseDir」の内容はお使いの環境に合わせて変更してほしい。まずは7行目のif文はforループで回しているターゲットをファイルに絞り込み、8~10行目はdateコマンドで対象となるファイルの年月日を、変数「YearStr」「MonthStr」「DayStr」に代入している。

その結果を用いたのが12~13行目。12行目のmkdirコマンドでディレクトリを作成しているが、オプション「-p」は必要に応じて親ディレクトリを作成し、既に存在していてもエラーを返さないというもの。13行目はターゲットファイルをmvコマンドで移動させている。前回同様、タイプミスなどでバグが侵入し、大事なファイルを消失してしまう可能性は拭い切れないので、「mv」コマンドを「cp」や「echo」に置き換えてからテストしてほしい。

シェルスクリプト前のフォルダー。今回のターゲットはファイルに限定している

シェルスクリプトを実行すると、ファイルの更新日を元に各フォルダーに移動させている

阿久津良和(Cactus)