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
** 画像にウォーターマーク(透かし)を入れたい **
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.exe
、powershell.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のおすすめ記事は以下です。
Bash on Windows(WSL)の出力をクリップボードにコピーする
Ubuntu VPS -> WSL -> Windows X11フォワーディングでグラフィカルウィンドウアプリを開く
WSL BashとPowershellで簡単なタイマーアプリを作る
Bashのおすすめ記事は以下になります。
Bashでインターネットのスピードを計測(ダウンロード/アップロード)
Bash ctrl-sでフリーズ(固まる)する機能を無効化するには
Bash inotifywaitでファイルが変更されたらコマンドを実行する
関連記事:
プログラミング学習で挫折する9割に入らない方法
プログラミングの意味って?勉強・学ぶ意味がないと思ってる人に読んでほしい
今すぐできる超簡単なプログラミングの始め方【Windows・Mac】
海外のプログラミング質問サイトまとめてみた
Markdown初心者向けチュートリアル・主要タグの使い方を解説。
HTML入門・基本の書き方・編集方法から勉強方法まで徹底解説
無料でプログラミング入門・2020年最新のおすすめ学習アプリ
プログラミング初心者のためのはじめてのssh接続
sublime text 3とかAtomとかVimとかあるけど、結局テキストエディタってどれがいいの?
プログラミング初心者にもわかりやすい正規表現完全入門
関連広告:
はじめてのプログラミングコース by テックアカデミー
Webデザインフリーランスコース by テックアカデミー
プログラミング&副業コース by テックアカデミー
エンジニア転職保証コース by テックアカデミー
初心者向けコース by Udemy