WSL(Windows Subsystem for Linux)を初期から使っている僕がLinuxやプログラミングの初心者向けにWSLのメリットを解説してみる

    >


数年前、Windows 10のアニバーサリーアップデートで導入された、Windows subsystem Linux。aka. Bash on ubuntu on windows, 通称 WSL。
正確にはWSLというのはubuntu/bashだけなく、その他のLinuxディストリビューションである、debian、Kali Linuxといったものも含めての名称となります。しかし実情、WSL=Bash on ubuntu on Windowsであると考えても差し支えはないでしょう。

WSLはその名の示すとおり、Windows上でLinuxを動かすためのシステムです。初期で使用できるLinuxコマンドのほぼ全てのコマンドを使用することができ、aptでpythonなどの外部パッケージをインストール、使用することも可能です。
また、cmd.exeなどWindowsに元から備わっているコマンドラインの標準出力をWSLに渡して処理すること、またその逆も可能です。

MacOSXにも同様のコマンドライン、Bashが備わっていることは有名ですが、OSXのBashは完全ではありません。(WSLもまた完全ではありませんが。)
今までBashを生かすためにOSXを使用していたデベロッパーが、これを期にWindowsへ移行してくることも考えられます。

しかしひとつ、間違いなく言えることがあります。

WSLは完全に、Windows 10の常識を破壊してしまいました。



なぜWSLを使うのか

普段からLinuxやコマンドライン(CLI)に触れていない方には掴みづらいかもしれないことですが、CLIインターフェイスというのはとても便利なソフトウェアなのです。
簡単なプログラミングであれば、何かソフトウェアを探し、ダウンロードすることなく、自分で作ってしまった方が早いということもしばしば。

CLIは主にファイルの操作、I/Oをすることが主な作業です。
例えば以下のようなものです。

** 数百のファイルを規則的に生成したい。(1.txtには1というテキストが、2.txtには2というテキストが入った状態でファイルが生成されます。) **

seq 1 3 | xargs -I {} bash -c "echo {} > {}.txt"

** ダウンロードフォルダの一番最新のファイルのパスをクリップボードにコピーしたい **

find /mnt/e/_downloads/ -type f -printf '%T+ %p\n' | sort -r | head -n 1 | sed -Ee 's/^.*(\/mnt.*)/\1/g' | clip.exe

** フォルダの中の全てのmp4ファイルをwavファイルとしてコピーしたい **

for i in *.mp4; do ffmpeg -i "$i" -vn -acodec pcm_s16le -ar 44100 -ac 2 "$i.wav"; done

フォルダ内のすべての.mp4を.wavへ変換

** 画像にウォーターマーク(透かし)を入れたい **

convert -size 280x160 xc:none -fill grey \
                -pointsize 24 \
                -gravity NorthWest -draw "text 10,10 'https://fumiya.org'" \
                -gravity SouthEast -draw "text 5,15 'https://fumiya.org'" \
                -channel alpha -evaluate multiply 0.30 \
                miff:- |\
    composite -tile - /mnt/c/_sharex/Screenshots/2019-02/ShareX_ScreenShot_6740af35-df45-4114-84d7-1ce0a124f851.png  wmark_text_tiled.png

ImageMagickでCLIからウォーターマーク入れた画像作る

これらをプログラミングすることができるようになれば、大抵のスモールソフトウェアは作れるようになります。小さなリコードで自分好みの設定に書き換えられるわけです。商用ソフトウェアでは、既存のコンフィグしか弄ることができませんね。

CLIでのプログラミングというのは全ての要で、とても重要なものになります。RubyやPythonを使ったプログラミングをするのにも、CLIの知識は必要です。単に便利なだけでなく、実用性も兼ね備えているのがCLIです。

LinuxのubuntuにおけるCLIというのがBashと呼ばれるもので、WSLは、Bash on Ubuntu On Windowsという別称の通り、Bash言語です。
こういったファイルを操作するBashのプログラミングが、Windows上で可能となるのが、WSLなのです。

現時点でWindowsを普段遣いで使っている、Linuxを使ったことない、慣れていないというのであればなおさらのこと、WSLを使ってみない理由はないでしょう。

実はこういったコマンドラインは、Linuxだけではなく、cmd.exepowershell.exeといったものが、Windowsにはもともと存在します。これらのコマンドラインソフトウェアを使用しても、似たようなことはできます。しかし、コードは全く異なりますので、覚えることはまるで違います。これからプログラミングを続けたい、システムエンジニアに将来的になりたい、Linuxに携わりたい、より面白いものを作りたい(書きたい)と考えているなら、Powershellなどより、Bash(Linux)を選択することを推奨します。

なぜWSLだけでは足りないのか

万能に思えるWSLですが、デメリットもあります。

まず、全てが可能であるわけではないということに注意してください。

Can I run ALL Linux apps in WSL?
No! WSL is a tool aimed at enabling users who need them to run Bash and core Linux command-line tools on Windows.

WSL does not aim to support GUI desktops or applications (e.g. Gnome, KDE, etc.)
Frequently Asked Questions (FAQ) | Microsoft Docs

上記の回答では、GUIアプリケーションを使うことは想定していないと書かれていますが、X serverを使用すれば可能ではあります。
といっても、全てのアプリが使えるわけではないということはそのとおりです。

具体例を上げましょう。まず”Ruby On Rails”。
僕がRailsはそれなりに長く触っていたので、もちろんWSL上で動かしたこともあります。しかしそれは間違いでした。

その結果どうなったでしょうか。エラーが出ました。解決不可能、再現不可能なエラーです。

Missing helper file helpers/c:/pg/rails/tool/app/helpers/application_helper.rb_helper.rbエラーはgithub上でも未だ解決していないエラーです。WSL上で何が原因かわからぬまま突然に発生します。
Railsの再インストールをしてもこの問題は解決しません。そういうたぐいの、とてもやっかいなバグです。

このようなエラーは、初心者が挫折しプログラミングをやめるきっかけになるには十分すぎる威力を持っています。

他にはどうでしょう。fuseというパッケージが使えないことも大きな問題です。

Add FUSE (Filesystem in Userspace) support in WSL – Welcome to the Windows developer feedback site!

fuseが使えると何がいいのでしょうか。まず、sshfsが使えるようになります。これは、LinuxにリモートのLinuxファイルシステムをマウントするソフトウェアです。WSLからリモートのファイルにアクセスしたり、処理したりできます。

といったように、WSLには欠陥やできないことが数多くあります。それらを補うためには、ピュアなLinuxを使う他に解決策は存在しないのです。

なぜLinuxをインストールしたパソコンではだめなのか

ここまで説明しましたが、こう思った方もおられるのではないでしょうか。

** いやいやわざわざWindows上にLinux環境を作るメリットがないでしょ。普通にLinux(ubuntu)使えばいいじゃん。 **

僕もそう思っていた時期がありました。

Windows 10ばかり使っている僕ですが、実はLinuxをインストールしたパソコンで作業していた時期が1年以上ありました。
たしかにLinux上で作業すれば、バグもありませんし、制約もありませんし、悪い選択ではないでしょう。
ただし僕はおすすめしません。なぜか。

Linuxはバグが多いからです。
まず、Windowsを7年近く使っていてしみじみと感じるのが、Windowsの安定性です。環境が壊れた、データが消えた、といったことがありません。
Linuxはどうでしょうか。僕は少なくとも、2回起動ができなくなりました。
大抵のことは、調べれば解決できます。それも解決する能力(主に英語力)があればのことですが、それでも解決できない場合というのはやはりあります。
Windowsであれば、何かを調べたり質問するのに英語力はさして必要ではありませんし、上記の通り環境が壊れるリスクは少ないです。

そして忘れてはいけない大前提ですが、そもそもLinuxというのは開発のためのOSであって、エクセルなどのミドルウェアを動かして仕事や一般作業をするためのものとして設計されていたものではないからです。
今でこそLinuxは使いやすいディストリビューションが出てきて開発も進み、MacやWindowsの無料の代替として使うという選択肢もできるまでになっていますが、実情、やはりまだ発展途上なのです。

人気なものを選ぶ。ということに対して抵抗を覚える方もおられるかもしれませんが、OSS(オープンソースソフトウェア)を選ぶ基準では人気が全てです。(少なくとも僕の哲学では3年以上前からそうです。)
人気なものは開発者が多く開発が盛んです。開発が盛んなプロジェクトはバグの発見と解決も早いのです。
LinuxとMac、Windowsのユーザー数分布を知っていますか。大雑把に言って、1:3:7です。Windowsの開発効率よりLinuxの開発効率のほうが7倍遅いと考えてみると簡単です。

まとめますと、Linuxを全ての環境の土台のOSとして使うのはおすすめできないということです。少なくとも2019年現在の時点ではね。

ここでは趣旨が違うので端折りますが、Linuxを使う場合はDockerやVirtualboxなどを選択肢として使用します。Dockerの場合はWindows上に構築するのではなく、SSH経由でピュアなLinux上で行います。(Docker on WSL(Windows)は前述のRuby on Railsと同様の結果を招くので推奨しません。)


WSLは万能ではありません。しかし、実用には問題のない範囲です。また、Linuxに手軽に触れる機会として、非プログラマに対しての敷居も低いものです。
WSLをはじめるのに戸惑う必要はありません。将来、Linux、プログラミング、システムエンジニアリングに携わりたいなら、WSLはあなたの良い練習相手、パートナーとなるでしょう。

ご清聴ありがとうございました。

以下記事でWSLのインストールを解説しています。

WSL bash on ubuntu on windows インストール手順

WSLのおすすめ記事は以下です。

WSLのbashからWindowsの実行ファイルを実行する

Bash on Windows(WSL)の出力をクリップボードにコピーする

Ubuntu VPS -> WSL -> Windows X11フォワーディングでグラフィカルウィンドウアプリを開く

WSL BashとPowershellで簡単なタイマーアプリを作る

Bashのおすすめ記事は以下になります。

Bashでインターネットのスピードを計測(ダウンロード/アップロード)

Bash ctrl-sでフリーズ(固まる)する機能を無効化するには

Bash inotifywaitでファイルが変更されたらコマンドを実行する

bash: imagemagickで画像変換を効率化する

WSL WSL bash on ubuntu on windows インストール手順
WSL(Windows Subsystem for Linux)を初期から使っている僕がLinuxやプログラミングの初心者向けにWSLのメリットを解説してみる




お困りですか?この記事で紹介していることをマンツーマンで指導、解説、代行します。まずはお気軽にお問い合わせください。


Close Menu