よりよい方法ができました
Windows 10 に新しい仕組みが導入され、よりよい方法ができました。以下の記事を参考にしてください。
はじめに
Linux や Mac になれると、Windows で作業をするのが本当に苦痛になってきます。
特にコマンドラインでの作業でそれが顕著ですよね。
ls
とか使いたいですよね。。。
実は、Windows 10 では WSL(Windows Subsystem for Linux)の機能を活用することで、Windows でも Linux のコマンドの多くを実行することができるのです!
WSLの設定が済んでいれば、ls
コマンドならwsl ls
と入力するだけで実行できてしまいます。
この記事では、WSL の設定と、Linux のコマンド類をさらに簡単に、ls
のように一語だけで実行する方法をご紹介します。
WSL の設定
WSL は 設定 > アプリ (アプリと機能) > プログラムと機能 > Windows機能の有効化または無効化 という深いところの設定を行います。
「Windows Subsystem for Linux」の項目にチェックを入れて「OK」をクリックします。
次に、スタートメニューの「Microsoft Store」で「Linux」を検索して好きな Linux のディストリビューションをインストールします。ここでは「Ubuntu」をインストールしましょう。
インストールが済んだら一度起動して初期設定をしたら準備完了です。
Linux コマンドの実行設定
いよいよ、Windows 10 で Linuxコマンドを簡単に実行する方法になります。
といってもやる作業は単純です。
まず、ユーザーディレクトリのルートあたりに(C:\Users\xxx)、linuxcmd.bat
というファイル名で以下のスクリプトを保存します。
@echo off doskey /MACROFILE=%~dp0.doskeys
そして同じディレクトリに、.doskeys
というファイル名で以下のスクリプトを保存します。このファイルがキモですね。
alias=if "$1"=="" (doskey /macros) else for /f "delims== tokens=1,*" %i in ("$*") do @if "%j" neq "" ( doskey $* ) else ( doskey /macros $b findstr /b /c:"%i=" ) pwd=cd traceroute=tracert ifconfig=ipconfig awk=wsl awk $* cat=wsl cat $* clear=wsl clear $* cp=wsl cp $* cut=wsl cut $* df=wsl df $* diff=wsl diff $* dig=wsl dig $* du=wsl du $* find=wsl find $* grep=wsl grep $* gzip=wsl gzip $* head=wsl head $* ip=wsl ip $* join=wsl join $* kill=wsl kill $* less=wsl less $* ls=wsl ls $* man=wsl man $* more=wsl more $* mv=wsl mv $* ps=wsl ps $* rm=wsl rm $* sed=wsl sed $* sort=wsl sort $* sudo=wsl sudo $* tail=wsl tail $* touch=wsl touch $* tr=wsl tr $* uniq=wsl uniq $* whoami=wsl whoami $* wc=wsl wc $* wget=wsl wget $*
これで準備ができたので、コマンドプロンプトを立ち上げてlinuxcmd.bat
を実行します。
そしてls
コマンドを実行してみると。。。
>ls Dockerfile centos result.txt sample.php~ test.txt~ test2.txt~ tr Dockerfile~ index.php sample.php test.txt test2.txt touch.txt
なんとls
コマンドが簡単に実行できてしまいました!
先程の.doskeys
に登録してあるコマンドは実行可能なのでいろいろと試してみて下さい。
普段使っている Linux コマンドはほぼ使えますね。
それで、毎回、linuxcmd.bat
を実行してもよいのですが、面倒なのでコマンドプロンプト起動時に初期化するようレジストリに設定を行うようにしましょう。
レジストリを触るので、この辺は自己責任でお願いします。
設定内容は以下のようになります。
レジストリ・キー | 適用スコープ |
---|---|
HKEY_CURRENT_USER\Software\Microsoft\Command Processor | 現在のユーザ |
名前 | 種類 | 設定値(例) |
---|---|---|
AutoRun | REG_SZ | C:\xxx\xxx.bat |
レジストリを直接いじるのが怖い方は、以下のスクリプトをlinuxcmdreg.bat
という名前で、linuxcmd.bat
と同じフォルダに作成し、ダブルクリックするだけで登録が完了します。
@echo off reg add "HKEY_CURRENT_USER\Software\Microsoft\Command Processor" /v AutoRun /d %~dp0linuxcmd.bat reg query "HKEY_CURRENT_USER\Software\Microsoft\Command Processor" /v AutoRun pause
さらに vim をインストールすればなおいい感じです。
これで快適な Windows ライフが送れますね!
ぜひお試し下さい。
Tips
ユーザーのホームディレクトリに移動する際、Linux では ~ (チルダ)を使いますが Windows では使用することができません。ですが、以下のようにwsl
をcd
の前に付けることで簡単にホームディレクトリに移動できます。
> wsl cd ~
nkf は Ubuntuに最初インストールされていないため使用できないのですが、以下のようにインストールすることで使用できるようになります。また、先程の.doskeys
ファイルにnkf=wsl nkf $*
のように追記します。
> wsl sudo apt-get update > wsl sudo apt-get install -y nkf
制限事項
この方法はなかなかにすばらしい方法なのですが、制限事項があります。
それはパイプ(|)で値を受けた場合は、以下のようには実行できません。
> cat test.txt | grep 111
このように使いたい場合は、以下のようにwsl
を使う必要があります。
> cat test.txt | wsl grep 111
あと若干コマンドの実行にもたつきますかね。
Linux コマンドを実行できるメリットからしたら小さなことですけどね。
また、日本語が含まれるWindows のコマンドの結果を Linux のコマンドに渡すと、以下のように文字化けしてしまいます。
c:\temp>dir | wsl while read s; do echo -e ${s};done; hCu C ̃{[ x Local Disk ł {[ VAԍ 6463-FF38 ł c:temp ̃fBNg 2019/02/25 01:54 <DIR> . 2019/02/25 01:54 <DIR> .. 2018/09/30 07:30 <DIR> FDDImage 2018/09/30 06:16 <DIR> MS-DOS-master 2018/11/17 14:02 <DIR> Start 2019/02/25 01:54 0 ĂƂӂ.txt 1 ̃t@C 0 oCg 5 ̃fBNg 98,985,025,536 oCg̋̈
この場合は、Windows の文字コードを SHIFT-JIS から UTF-8 に変換してから Linux に渡します。文字コードの変換には、nkf -w
を使用します。
何度試しても一度おかしな結果が返ってきますが、2回目以降は Windows のメッセージが英語になり日本語ファイル名は正しく表示されます。まだ完全ではないのかもしれませんね。
・1回目
c:\temp>dir | wsl nkf -w | wsl while read s; do echo -e ${s};done; ドライブ C のボリューム ラベルは Local Disk です ボリューム シリアル番号は 6463-FF38 です c:temp 縺ョ繝・ぅ繝ャ繧ッ繝医Μ 2019/02/25 01:54 <DIR> . 2019/02/25 01:54 <DIR> .. 2018/09/30 07:30 <DIR> FDDImage 2018/09/30 06:16 <DIR> MS-DOS-master 2018/11/17 14:02 <DIR> Start 2019/02/25 01:54 0 縺ヲ縺吶→縺オ縺√>繧・txt 1 蛟九・繝輔ぃ繧、繝ォ 0 繝舌う繝・ 5 蛟九・繝・ぅ繝ャ繧ッ繝医Μ 98,982,354,944 繝舌う繝医・遨コ縺埼伜沺
・2回目以降
c:\temp>dir | wsl nkf -w | wsl while read s; do echo -e ${s};done; Volume in drive C is Local Disk Volume Serial Number is 6463-FF38 Directory of c:temp 2019/02/25 01:54 <DIR> . 2019/02/25 01:54 <DIR> .. 2018/09/30 07:30 <DIR> FDDImage 2018/09/30 06:16 <DIR> MS-DOS-master 2018/11/17 14:02 <DIR> Start 2019/02/25 01:54 0 てすとふぁいる.txt 1 File(s) 0 bytes 5 Dir(s) 98,980,937,728 bytes free