Bash on WindowsからWindowsアプリを起動する

(2017/08/29 追記)
コメントにいただいた手法の通り、現在はexeファイルのダイレクト指定で起動できます。
またWindows側でもパスを通せば``sakura.exe``のように打つことで起動できます。
この原因はWindows10のCreators Updateが充てられていなかったためでした。
コメントありがとうございました。
技術面での記録としてこの記事は残しておきます。

これは経験を記録した備忘録です。手順通りやると#3あたりから痛い目にあいます。
そのあたりを了承して読んでください。

#1 何故に遠回りするのか？
Bash on Windows(BoW)を使っていると、やっぱりまだどこかしら不便さが残ります。
UNIXシステムでは標準のX WindowシステムもWindows経由するだけで一気に見栄えが変わります。
だったら最初からLinuxなりなんなり使えばいいと思われるでしょうが、~~今から改めて入れるのが面倒なのではなく~~Windows専用アプリに組み込むためには準備してしまった方が早いのです。
~~それにcmd.exeに環境整えるよりも早いと思うし。~~

#2 Bash on Windowsの導入
機能実装から時間がかなり経過しているので、ご存知の方も多いと思います。
以下の記事を参考にしながらBoWを導入しました。

+ [Bash on Ubuntu on Windowsをインストールしてみよう！](http://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

***
(以下は個人的な問題かもしれません)
記事中の「リポジトリの変更」で、日本サーバー設定する際に jaist.ac.jp がすごく重いことがある。
Byte/sの単位の通信速度は致命的ですので、異常に遅いときは(双方)回線の太さをチェックするといいでしょう。
[Ubuntu 日本国内のダウンロードサイト](https://www.ubuntulinux.jp/ubuntu/mirrors)
僕個人は 山形大学 の回線がいいのではないかと思ってます。
***

ただBoWはデフォルトではCドライブの奥の奥にシステムクラスの隠しフォルダとして存在しています。

+ [【シェル芸人への道】Bash on Windowsを探検する](http://qiita.com/t_nakayama0714/items/9d7cfc5029a9b2ea423d)

> C:\Users\\[Username]\AppData\Local\lxss\rootfs

てことでこんなところにホームディレクトリ設定されたら、Windowsシステムと相互利用する際に不便極まりない。
よって下の記事を参考にホームディレクトリを変更する。

+ [Bash on Windowsのホームディレクトリ変更](http://tadaoyamaoka.hatenablog.com/entry/2016/08/06/112047)

さてそうなると`/etc/passwd`を編集しなくてはなりません。
何も考えずに`sudo -S emacs /etc/passwd`とか適当なエディタを起動してCUI環境で見ましょう。
え、きれいに見えた？それは幸せなことです。アプデをきっちり充てていたのでしょう。
当初は表示が見切れたりして厳しい時代があったのです。
あとX Window SystemのWindows用を入れた方はGUIでも見れるでしょう。~~見やすいと言えるかは人それぞれです。~~
不幸にもかつての僕みたいに表示が崩れるなど残念な経験をするとこう感じることでしょう。
「せっかくWindowsで動かしてるんだから、編集もWindowsで慣れたエディタ使いたいなあ」
~~なおLinuxで普段使うエディタは gedit だったりします。~~
ここは我慢して、`vi`なり`emacs`なりで

> `username:x:1000:1000:"",,,:/home/username:/bin/bash`

の行を

> `username:x:1000:1000:"",,,:/mnt/d/home:/bin/bash`

とかに変更しましょう。ここではDドライブ直下の`home`フォルダにホームディレクトリを指定することにしましょう。
Bashに戻り`pwd`と叩いて`/mnt/d/home/`と出力されればめでたしめでたし。
あとは好きなようにライブラリなり、コマンドなりを追加しましょう。

#3 Bash on Windows経由でWindowsプログラムを動かす
まあ、あらかたの方はこんなこと考えないと思います。
でもニッチな世界で無理を通そうとする僕には、こういう技が必要なんです！検索しても引っかからないような世界を開拓するのが役目なんです。
そのきっかけは上でも書きましたが、当時のエディタが(当然ですが見栄えや機能的に)残念だったのでWindows側で処理しようと思い立ったからです。
サンプルとしてBashから[サクラエディタ](http://sakura-editor.sourceforge.net/index.html.ja)をWindowsで起動することを目標にしましょう。これができれば文字コードも改行コードも気にせずに作業できますね！

目標のコマンドイメージ
``sakura hogehoge.txt &
``

残念ながら、デフォルトではBash経由でWindowsプログラムを動かすことはできません。
そこでBash(Ubuntu)とWindows間を疑似的に通信することでやりとりを行うという荒業を行います。
今回`wstart`を用います。

+ [(Git)wstart](https://github.com/retorillo/wstart)
+ [Bash on Ubuntu on Windows上でTeXLiveのコンパイル&プレビュー環境を構築する（その1）](http://qiita.com/kuro_23/items/6bb7e3d470d04209bd03)

この二つの記事を参考に頑張りましょう。

##3.1 node.jsをインストール

+ Windows版

> 単純に[Node.js](https://nodejs.org/en/)から安定版（4.5.0）[^1]をダウンロードしてインストール。

[^1]: 最新版は 7.10.0 のようです(2017.5.16現在)

+ Linux版

> Bash on Ubuntu on Windows上のapt-getでインストールされるnodejsとnpmはバージョン条件を満たさないようなので、[Ubuntuに最新のNode.jsを難なくインストールする](http://qiita.com/seibe/items/36cef7df85fe2cefa3ea)を参考にして[n package](https://github.com/tj/n)を使ってインストール。

そのまま従って入れましょう。
インストールは[README](https://github.com/retorillo/wstart/blob/master/README-ja.md)を参考にしましょう。日本語化もされているので困るところは少ないでしょう。
唯一引っかかる可能性があるのは、`<WINUSERNAME>`の箇所でしょう。Windowsユーザー名の指定とありますが、もしうまくいかなかった際には名前全体を大文字で打ち込んでみましょう。案外すんなりいくことが多いです。

##3.2 動作確認
`cmd.exe`を起動して、`wstart`と打ち込みましょう。

``2017-05-13T13:19:07.282Z [1] Starting server 1.0.1
2017-05-13T13:19:07.294Z [1] Listening on port 62000
``

こんな感じの出力がなされればうまく機能しているでしょう。Bash側で`wstart .`と打ち込んでエクスプローラーが起動すればOK。

##3.3 応用
ここまでうまくいったら後は`wstart`部分に引数でフルパス指定すればいいじゃん？
そう、これでうまくいくならこの記事は長くならなかったはず。てことで、サクラエディタをフルパスで起動してみましょうか。

###3.3.1 フルパス指定

``wstart /mnt/c/Program\ Files\ \(x86\)/sakura/sakura.exe
``

おそらく素直に起動せず、新しいDOS窓が開くだけだと思います。これはDOS窓における以下のコマンドと等価のためです。
``cmd /c start "C:\Program Files (x86)\sakura\sakura.exe"``

この通りにDOS窓で実行すると先ほどと同じ結果が得られます。
別窓を開いても困るだけなので、出てきた窓を大人しく閉じて次の作戦を考える。

###3.3.2 実行ファイル名で指定
フルパスがうまくいかないのなら、実行ファイル名だけで動けば問題なし。
と、慌てて`wstart sakura.exe hogehoge.txt &`なんて打ち込むような人はいないと思うが、これだと「sakuraなど知らん」とWindowsに叱られて終わります。
「そうだよ、パスを通さなくちゃ」
と次の発想にたどり着くので、パスを通す。
Windowsの`PATH`の通し方はいろんなところに書かれています。頑張って通しました！
意気揚々と
`wstart sakura.exe hogehoge.txt &`
打ち込んで戻ってくる返事は、
``'sakura.exe' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
``
お約束ながら、残念な結果になりますね。パスが通っているだけではうまくいかないだけでなく、フルでプログラム名を打つのにも困ります。
追撃すると、この作業はなくても問題ないです。次行きましょう。

###3.3.3 レジストリいじるか
**(警告)
ここから先はレジストリ領域に触れることになります。パラメータを追加するだけですが、操作ミスに注意してください。また内容を理解して慎重に操作して下さい。不具合でても責任は負えませんのであらかじめ断っておきます。**

`wstart`コマンドは引数に別コマンドを受け取る。なので、`wstart cmd`とか打つと新しいDOS窓が開くというわけだ。
なら、この仕組みを応用してしまえばいいではないか？と考えるのは自然な発想だろう。
ということで、目標コマンドは次のように修正される。
`wstart sakura hogehoge.txt &`
するとこんな記事に出会った。

+ [コマンドラインからプロセスを起動・終了する方法　（環境変数とレジストリについて）](http://language-and-engineering.hatenablog.jp/entry/20081028/1225160338)

さて、記事中の4つの方法のうち1,3,4はどうも失敗したようなので、残りの2にかけることにする。
そうしたら、こんなことが書かれているのに気づく。
> startコマンドは，HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths　というレジストリキーの値を参照する。
> もしもこのレジストリの中にアプリケーションのファイルパスが含まれていれば，
>
> +  start ファイル名
> + 「ファイル名を指定して実行」
>
> のどちらからも実行する事ができるのだ。

とか言われたら、やるしかない。`regedit`からレジストリエディタを開いて、`HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\`を探す。
そこに`sakura.exe`フォルダを追加し、「値のデータ」にサクラエディタへのフルパスを指定する。

保存後には念のため、（なくても構わないと思うが）再起動しておくとよい。
戻ってきたら、Win側のnode.jsサーバーが動いている状態で、`wstart sakura hogehoge.txt &`と打ち込んでみよう。
見事にバックグラウンドでサクラエディタが起動する。
最後が少し面倒だが、こうすれば問題なくエディタをWindows仕様で使うことができる。
後は好きなだけプログラムを書いて、チェックして、リリースをしていこう。

最後に、文字コードはUTF-8、改行コードはLFにするのをお忘れなく。

#4 まとめ
+ Bash on Windowsを入れる
+ node.jsをインストール(Win,Bashともに)
+ wstartもインストール(Win,Bashともに)
+ どうしてもWindows側のプログラムを起動したいなら、レジストリに追記する。

#5 トラブル時は？(2017-08-20追記)
+ 以下のようなエラーが出るとき

`throw er; // Unhandled 'error' event`

Windows側でnode.jsが起動していないときにこのエラーが返ります。
cmd.exe で`wstart`が起動しているか確認しましょう。
DOS窓起動しっぱなしは気になりますが、我慢するしかないようです。

+ 最近、node.jsに関して最新バージョン8の場合にうまく動作しないことがありました。記事執筆時のバージョン7.10.0では機能することを確認していますので、問題が起きたときは最新版を使わないのも一つの手でしょう。

各OSタイプでのバージョン管理は、それぞれ以下のページを参照してください。
バージョン管理ソフトが異なったりする関係で少し面倒ですが、node.jsのバージョンだけ合わせればいいでしょう。

[Windowsの場合](http://qiita.com/yokoh9/items/20d6bdc6030a3a861189)
[Linuxの場合](http://qiita.com/bigplants@github/items/2d75bf552e0da4a7e822)

+ それでも直らない？

wstartを再インストールしましょう。基本ですね。

#6 コメントへの返答(2017-08-29追記)

> sakura.exeで起動しません？  notepad.exeとかは？

これは記事中にも書きましたが、ダイレクトでのexe指定は起動しません。Windowsに叱られるのがオチです。
またnotepad.exeは、Windowsの改行・文字コードが(CR+LF)+SJIS固定のはずです。他に変更できません。
よってUNIX系システムでは何の役にも立つことはありません。
高機能な他のテキストエディタを利用しましょう。

---