"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

WSL(Windows Subsystem for Linux)環境構築と個人的にオススメのコマンド例を2つほど。

Windows10のWSL(Windows Subsystem for Linux)を使えるようにする方法と、個人的にPythonの開発・テスト時に使うオススメのコマンド例を2つほど紹介します。

f:id:arakan_no_boku:20190714141217p:plain

 

Windows Subsystem for Linuxについて

 

Windows Subsystem for Linux(以後 WSL)は、Windows10のコマンドプロンプトからLinuxのコマンドを使えるようになる仕組みです。

 

自分はLinux使いではありません。

サーバーを立てたりする時とかには使うので、基本的なLinuxパーミッションやコマンドについての知識は持ってます・・程度の人間です。

それでも、WindowsのCMDは凝ったことをするには非力だなと感じることが多くて、PowerShellでやるのも面倒くさいと感じるとき、これLinuxならサクッとできるのにな・・などと思う時はあるわけです。

そんな時に、Linuxコマンドも試せる環境を作っておくのも悪くないなと思ってます。

 

WSLを有効にする

 

WSLはWindows10のデフォルトでは有効になってません。

まず、コントロールパネルの「プログラムと機能」の「Windowsの機能の有効かまたは無効化」で以下のダイアログボックスを表示します。

f:id:arakan_no_boku:20190714143743p:plain

上記のように、「Windows Subsystem for Linux」にチェックを付けてOKして、そのまま再起動します。

 

Linuxディストリビューションのインストール

 

再起動できたら「コマンドプロンプト」を立ち上げてbashと打ち込んで実行します。

そしたら、こんなエラーメッセージが表示されるはずです。

f:id:arakan_no_boku:20190714144134p:plain

そこに表示されているURLにアクセスします。

https://aka.ms/wslstore

マイクロソフトストアを開くかと聞いてくるのでOKすると以下の画面になります。

(2019/07/14時点です)

f:id:arakan_no_boku:20190714145102p:plain

自分は「ubuntu」を選びました。

理由は使ったことのある回数が一番多いから・・だけです。

f:id:arakan_no_boku:20190714145323p:plain

入手ボタンを押すとダウンロードされます。

f:id:arakan_no_boku:20190714145822p:plain

ここで起動すると、インストールが開始します。

途中でユーザ名、パスワードの設定を聞いてくるので、入力します。

Windowsのユーザ名と一致している必要はありません。

f:id:arakan_no_boku:20190714152656p:plain

ユーザ名とパスワードを入力してOKになったら、一旦終了です。

この時設定したユーザ名とパスワードは忘れないようにしないといけません。

通常使う分にはいらないのですが、sudoコマンドなど、パスワードを聞いてくるケースがありますから。

さて。

もう一度、コマンドプロンプトを立ち上げて、bashと入力します。

以下のようにLinuxbashプロンプトがでたら、OKです。

f:id:arakan_no_boku:20190714153600p:plain

ちなみに、bashプロンプトで「exit」と打ち込みEnterを押すと、元のコマンドプロンプトに戻ります。

 

WSLを使ってみる

 

bashプロンプト上では当然、Linuxのコマンドを実行できます。

さらに、bashプロンプトではWindowsのコマンドも使えます。

なので。

うまく使えば、WindowsコマンドとLinuxコマンドを連結したワンライナーまで書けてしまうという柔軟さがあります。

といっても。

bash上でWindowsコマンドを使うには、ちょっとだけ注意すべき点があります。

  • オプションは「/」ではなく、「-」で与える必要がある
  • パスの区切り文字が「\」ではなく「/」でないといけない
  • Windowsのコマンドは、.exeなど拡張子を省略しない方が良い

てな感じです。

さて、例です。

 

WindowsLinuxのコマンドを混在して使う例

 

たとえば、Dirコマンドを使ってみます。

普通のコマンドプロンプトで実行するとこんな感じ。

f:id:arakan_no_boku:20190714161117p:plain

オプションは「/b」のように「/」ですし、パス区切りも「\」です。

これをbashプロンプトで実行します。

f:id:arakan_no_boku:20190714161501p:plain

dir -b ./00_sk/*.py のように、オプションを「-」にして、パス区切りを「/」にしたら、ちゃんと実行できました。

これができれば、Windowsコマンドと、Linuxコマンドを混在させたワンライナーが使えて超便利です。

例として「autopep8」を使って、フォルダにあるpythonファイルの一括整形をやってみます。

autopep8はPythonの標準コーディングスタイルPEP8に準拠する形に、ソースコードを自動フォーマットしてくれる超便利なウールです。

arakan-pgm-ai.hatenablog.com

でも、ワイルドカードが使えないので、フォルダ内のPythonソースを一括でフォーマットしたいときなどは、ちょっと工夫が必要になります。

それをWSLの機能を使うとワンライナーで、スマートに書けます。

かつ、これは、Windowsの「dir」の出力をパイプでつなぎ、Linuxの「xargs」にWindowsにインストールした「autopep8.exe」を渡して、一括実行させるというハイブリッドの例でもあります。

dir -b ./00_sk/*.py | xargs autopep8.exe --in-place --aggressive --aggressive

これで、カレントフォルダ「.」にある「00_sk」フォルダの下の「拡張子py」のファイルが、順次「autopep8.exe --in-place --aggressive --aggressive <fname>」の「<fname>」の部分にはまって、実行されていきます。

 

開発・テストに便利なLinuxコマンドの例

 

今度は、Linuxのコマンド単体で便利なのに、Windowsでは使いづらかったコマンドの例をやってみます。

tailコマンドです。

tailは、ファイルの最後から指定行分表示するという単機能コマンドですが、これが、ログの監視とかでは非常に役に立ちます。

例えば、監視対象のログファイルがカレントフォルダのlogsの下にある「testlog.log」だったとしたら、以下のようなコマンドをうちます。

tail -f ./logs/testlog.log

tail -f にすると、ファイルの最後尾から10行ぶん表示して、待機状態にはいります。

このままファイルの変更を監視して、書き込みがあると表示を更新してくれるので、ログの監視にピッタリなのです。

f:id:arakan_no_boku:20190715085721p:plain

プログラムで適切なログを出力するようにしていれば、時間のかかる処理でも、状況がわからずに待っているより、ログが流れるのを見ている方が精神的には良いです。

このログファイルに書き込む処理を流してみます。

import logging

# ログをファイルにはきだす
logging.basicConfig(filename='logs/testlog.log', level=logging.DEBUG)

# ログを出力する
for i in range(100):
    logging.info('warning %s %s', 'testlog', str(i))

これを流すと、コマンドプロンプト上をログがさーーっと流れて行って、以下のような表示でまた待機にはいります。

f:id:arakan_no_boku:20190715090355p:plain

いい感じです。

監視を打ち切る時は、「Ctrl+C」を押します。

 

まとめ

 

もちろん、Windows上でLinuxのシェルを動かしているわけですから、若干制約はあります。

特に大きいのは、Windows側からWSL上のファイルにアクセスができないってことですかね。

でも、WindowsとWSL(Linux)の相互運用性を高める改善はどんどん行われているようですし、なにより、その程度の制約など気にならないくらいに、Windowsのシェル環境が強力かつ便利になるのは間違いないです。

news.mynavi.jp

www.atmarkit.co.jp

Linuxの勉強目的なら、仮想環境でLinuxサーバーを立ち上げた方が良いと思うのですが、LinuxWindowsの便利なところをハイブリッド化して、快適なシェル環境を構築できる可能性ができたというだけで、WSLは素晴らしい。

個人的にはそう思っています。

ではでは。