Bash on Ubuntu on Windowsを使いこなしたかった

おはこんばんちわ、shotです。

この記事はAmCrアドベントカレンダー2018の23日のために書いたものです。

突然ですが、皆さんはBashを知っていますか?

MacやLinuxに備わっているUnixシェルで、コマンド入力を行うと色々出来る便利な代物です。

しかしながら、WindowsはUnixではないためBashの代わりにコマンドプロンプトというものが備わっています。

が、このコマンドプロンプト、はっきり言ってBashより不便。。。

この事態をなんとかすべく生み出されたのが、Bash on Ubuntu on Windows(以下Bash)という名前からしてやばそうな代物です。今回はこれについて雑に語っていきたいと思います。

まずこのBash、字のごとくWindowsに乗ったUbuntuの中で動作しています。「仮想環境じゃWindows内のファイル直接いじれなくない?」と思われた方、ご心配なく。このUbuntuは、Windows Subsystem for Linux(WSL)に展開されているのです。突然出てきたWSLは何かというと、


Windows Subsystem for Linux (WSL) とは、Linuxの(ELFフォーマット形式の)バイナリ実行ファイルWindows 10およびWindows Server上でネイティブ実行するための互換レイヤーである。

フリー百科事典『ウィキペディア(Wikipedia)』Windows Subsystem for Linux 

正直こう言われてもピンときませんが、雑に言うと、「Linuxの便利なところが発揮できるだけの土台」です。そのため、コマンドプロンプトと同じ感覚でファイルを触ることが出来ます。ちなみに、LinuxOSの全てを備えているわけではないため、仮想環境より軽量で済んでいます。

さて、前置きもほどほどに、まずは良いところを紹介したいと思います。

+1.様々なプログラミング言語の環境が標準装備

個人的にはなんといってもこれです。Windowsでは、プログラミング言語の環境を整えるだけで公式サイトから言語のコンパイラなどをダウンロードしてパスを登録して・・・とか色々やる必要があり、その上何故かうまくいかないということが多発します。このせいでMacを選ぶ人もいるくらい大変です。

このBashはMacやLinuxと同じく、もとからC,C++,Java,Python,Rubyなど、多くの言語のコンパイラなどを備えており、とっても便利です。

+2.apt-getで必要な環境を簡単にインストールできる

これもBashの大きな特徴です。Windowsでは言語環境を構築するために公式サイトからソフトをインストールする必要がありますが、このBashではLinuxのBashと同様にapt-getコマンドで、様々なものをインストールすることが可能です。例えば、Ocamlの環境はWindowsではCygwinをダウンロードした後にOcamlをダウンロードしてきて云々・・・する必要がありますが、Bashでは

$ sudo apt-get install opam

この一行を打つだけでOcamlの環境構築が終わります。

とっても便利ですが、大切な注意点があります。それはまた後述。

では逆に、やばそうなこのBashのやばいところを紹介します。

-1.ls,manがあるのにdir,helpが存在する。

多分Microsoftの意地(適当)。良くわからないという方のために説明すると、ls,manはMacやLinuxのBashにおいて、dir,helpはコマンドプロンプトにおいてそれぞれフォルダの中を見る、コマンドについての説明を見るコマンドです。

通常のMacやLinuxのBashではdirコマンドは存在しませんし、man的意味のhelpコマンドもありません。。。

この重複の時点で謎ですが、さらに謎な事にdirについてのマニュアルが存在します。せっかくなのでlsのマニュアルと比較してみます。

NAME
ls – list directory contents
SYNOPSIS
ls [OPTION]… [FILE]…
DESCRIPTION
List information about the FILEs (the current directory by default). Sort entries alphabetically if none of
-cftuvSUX nor –sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, –all
do not ignore entries starting with .
-A, –almost-all
do not list implied . and ..
–author
with -l, print the author of each file
-b, –escape
print C-style escapes for nongraphic characters
–block-size=SIZE
scale sizes by SIZE before printing them; e.g., ‘–block-size=M’ prints sizes in units of 1,048,576
bytes; see SIZE format below
NAME
dir – list directory contents
SYNOPSIS
dir [OPTION]… [FILE]…
DESCRIPTION
List information about the FILEs (the current directory by default). Sort entries alphabetically if none of
-cftuvSUX nor –sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, –all
do not ignore entries starting with .
-A, –almost-all
do not list implied . and ..
–author
with -l, print the author of each file
-b, –escape
print C-style escapes for nongraphic characters
–block-size=SIZE
scale sizes by SIZE before printing them; e.g., ‘–block-size=M’ prints sizes in units of 1,048,576
bytes; see SIZE format below

全 く 同 じ ! !

でも実際使ってみるとちょっと表示が違ったりします。・・・・・???

面白いなぁ(白目)

-2.apt-getでインストールしたものはWindowsに入らない

一瞬混乱しますが、冷静に考えればこの仕様は理解できます。

このBashはあくまでUbuntuの上で動いているため、apt-getで手に入れたものはUbuntuの中に入るのです。先ほどの例でいうと、コマンドプロンプトでOcamlを起動させることは出来ないということになります。>bash → $Ocamlという過程を経る必要があります。

これを知らないとWindowsで使いたいソフトをUbuntuにインストールしてしまいわけがわからなくなってしまう事があるので注意が必要です。

いかがだったでしょうか、Bash on Ubuntu on Windowsの魅力とやばさ、少しはわかっていただけたでしょうか。

まだまだ利用者は少ないように感じますが、うまく使えばとっても便利なツールだと思います。あと個人的にはこの癖のある仕様を使いこなしたいというチャレンジャー精神がかき立てられて好きです。

ちょっとでも興味を持たれた方、環境構築に○された方、dirとhelpを試してみたい方、2019年Bash on Ubuntu on Windows初め、してみませんか?