Windows10でLinuxコマンドを簡単に実行する画期的な方法を見つけた


はじめに

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」をクリックします。

f:id:fnyablog:20190223224915p:plain:w320

次に、スタートメニューの「Microsoft Store」で「Linux」を検索して好きな Linux のディストリビューションをインストールします。ここでは「Ubuntu」をインストールしましょう。

f:id:fnyablog:20190223225351p:plain:w480

インストールが済んだら一度起動して初期設定をしたら準備完了です。

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 をインストールすればなおいい感じです。

qiita.com

これで快適な Windows ライフが送れますね!

ぜひお試し下さい。

Tips

ユーザーのホームディレクトリに移動する際、Linux では ~ (チルダ)を使いますが Windows では使用することができません。ですが、以下のようにwslcdの前に付けることで簡単にホームディレクトリに移動できます。

> 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

参考サイト

www.atmarkit.co.jp

qiita.com

qiita.com