インストール不要！WindowsでLinuxコマンドを使う

(2018/11/17更新)
記事公開から3年経過し、WindowsにおけるLinuxコマンドの扱いについて取り巻く環境が変化してきたため内容をアップデートしました。合わせてWindows上でシェルスクリプトを実行するためのTipsも追加。

(2025/1/20更新)
- Windowsをとりまく環境の変化に合わせてアップデート
- ダウンロードできるバイナリの種類の説明を追加
- httpdも増えててさらに便利
- その他こまごました修正

# 前置き
Linuxなどの環境を使いはじめて慣れてくると、シェルや各種Unix系コマンドの使いやすさが手放せなくなってきます。そんなときにWindowsでデータの編集や解析などを行おうとすると、大変不便に感じてしまいます。

Windowsにも元々コマンドプロンプトや、PowerShellといった環境はあります。しかしこれらを駆使してLinuxと同等のことがしたい、と思ったものの挫折した経験を持たれている方は少なくないのではないでしょうか。（私の場合は、コマンドプロンプトやバッチファイルの貧弱さではどうしようもなく。PowerShellは学習コストが高そうなため未だに食わず嫌いしてます…）

Windows上でLinuxの環境を利用するためにの方法として、Hyper-VやVMwareなどの仮想環境や、各種UnixコマンドのWindows用バイナリの詰め合わせであるCygwinなどがあります。しかし、ちょっとdiffやgrepを使いたいだけ、というようなシーンには大規模すぎて不向きです。

そんな中、WSL (Windows Subsystem for Linux) が提供され始め、以前よりもライトにLinux環境が使えるようになりました。とは言いながらも、WSLもやはり有効化して再起動して、ディストリビューションをインストールして…という準備が必要です。

- 会社のPCで管理者権限がない（インストールができない）
- 他人のPC
- ディスク容量がカツカツ

…と言った環境ではやはりWSLも選択肢から外さざるを得ません。

# そこでbusybox
前置きが長くなりましたが、ここではインストール作業不要で気軽にWindows環境でUNIX、Linuxのコマンドを利用する方法を紹介します。

利用するのは、 **busybox-w32** です。

BusyBoxとは、主たるコマンドを単一のバイナリにまとめたもので、組み込み系のシステムでよく使われています。最近ではAndroid関連でもちょくちょく目にすることがあります。詳細は[Wikipedia](https://ja.wikipedia.org/wiki/BusyBox)をどうぞ。

busybox-w32は、その名のとおりBusyBoxをWindows環境にポートしたものです。

# 使い方
使い方は非常に簡単です。バイナリをダウンロードして、あとは煮るなり焼くなり使えます。

## ダウンロード
以下のサイトからダウンロードできます。

[busybox-w32](http://frippery.org/busybox/)

ページの下の方に最新バージョンをダウンロード可能なリンクがあります。

ファイルサイズは1MBもありません。.exeの実行ファイルがダウンロードできますが、インストーラーではなく実行ファイルそのものです。パスの通った場所に保存しておくと便利です。

実行ファイルへのリンクはいくつかありますが、2025年1月時点では通常``busybox64u.exe``をダウンロードすればいいと思います。それぞれの違いについて、以下に簡単に説明を付けておきます。

| 実行ファイル | 概要 |
|---|---|
| busybox.exe | 32bit版バイナリ。今や32bit版をあえて選ばないといけないケースはほぼない。Unicode非対応のため日本語などは文字化けしてまともに扱えない |
| busybox64.exe | 64bit版バイナリ。こちらもUnicode非対応 |
| busybox64u.exe | 64bit版でUnicode対応のバイナリ。日本人ならこれを使うのがよい |
| buxybox64a.exe | Arm版。Unicode対応は不明。Surface Pro（第11世代）やSurface Laptop（第7世代）といったArmアーキテクチャのCPUが乗ったPCに入れる場合はこちらを選択（使ったことないけど） |

ダウンロードした実行ファイルを引数なしで実行すると、バージョン情報、使い方、使えるコマンドの一覧が表示されます。バージョンアップすると新しいアプレット（コマンド）が増えていることも。

```
d:\bin>busybox64u.exe
BusyBox v1.37.0-FRP-5467-g9376eebd8 (2024-09-15 08:56:36 UTC)
(mingw64-gcc 14.1.1-3.fc40; mingw64-crt 11.0.1-3.fc40; glob; Unicode)

BusyBox is copyrighted by many authors between 1998-2024.
Licensed under GPLv2. See source distribution for detailed
copyright notices.

Usage: busybox [function [arguments]...]
   or: busybox --list[-full]
   or: busybox --install [-s] [-u|DIR]
   or: busybox --uninstall [-n] file
   or: function [arguments]...

        BusyBox is a multi-call binary that combines many common Unix
        utilities into a single executable.  The shell in this build
        is configured to run built-in utilities without $PATH search.
        You don't need to install a link to busybox for each utility.
        To run external program, use full path (/sbin/ip instead of ip).

Currently defined functions:
        [, [[, ar, arch, ascii, ash, awk, base32, base64, basename, bash, bc, bunzip2, busybox, bzcat, bzip2, cal, cat,
        cdrop, chattr, chmod, cksum, clear, cmp, comm, cp, cpio, crc32, cut, date, dc, dd, df, diff, dirname, dos2unix,
        dpkg, dpkg-deb, drop, du, echo, ed, egrep, env, expand, expr, factor, false, fgrep, find, fold, free, fsync,
        ftpget, ftpput, getopt, grep, groups, gunzip, gzip, hd, head, hexdump, httpd, iconv, id, inotifyd, install,
        ipcalc, jn, kill, killall, lash, less, link, ln, logname, ls, lsattr, lzcat, lzma, lzop, lzopcat, make, man,
        md5sum, mkdir, mktemp, mv, nc, nl, nproc, od, paste, patch, pdpmake, pdrop, pgrep, pidof, pipe_progress, pkill,
        printenv, printf, ps, pwd, readlink, realpath, reset, rev, rm, rmdir, rpm, rpm2cpio, sed, seq, sh, sha1sum,
        sha256sum, sha3sum, sha512sum, shred, shuf, sleep, sort, split, ssl_client, stat, strings, su, sum, sync, tac,
        tail, tar, tee, test, time, timeout, touch, tr, true, truncate, ts, tsort, ttysize, uname, uncompress,
        unexpand, uniq, unix2dos, unlink, unlzma, unlzop, unxz, unzip, uptime, usleep, uudecode, uuencode, vi, watch,
        wc, wget, which, whoami, whois, xargs, xxd, xz, xzcat, yes, zcat
```

使い慣れたコマンドが並んでいるかと思います。各コマンドを起動するには、``busybox.exe``の第1引数にコマンドを渡します。その後ろにコマンドの引数を並べられます。また、ファイル名をリネームしてもそのコマンドとして使えます。本家BusyBoxと同じようにシンボリックリンクでも可能と思います。

上記Usageにあるとおり、``busybox --install [DIR]``で任意のフォルダに全コマンドを展開することもできます。この場合はハードリンクで展開されるようです。

## シェルを使う
何かとかゆいところに手が届かないコマンドプロンプト。早速シェルを使いましょう。``busybox sh -l``でログインシェルとして起動します。

起動したシェルでは、busybox-w32に含まれているコマンドはそのまま使えます。また、Cygwinと同じように、Windowsの実行ファイルもここから実行できます。``DIR``などの内部コマンドを使いたいときは、``cmd /c dir``などとして実行すればOKです。

## 個人的にお気に入りなコマンドたち
このコマンドまで使えちゃうんだ！とか、意外と便利な使い道があるコマンドを少し紹介。

### ネットワーク関連コマンド
wget, whois, nc, httpd など。

nc (netcat)も使えるのは結構感動だった。どれもWindows単体では実現できないので、意外と悩む。他にもftpgetとかftpputとかあるみたいだけど使ったことはない。

いつの間にかhttpdも追加されていた。LAN内で一時的なファイル共有とかに便利。ちなみにCGIも使えるようで、バッチファイルをCGI化など使い方によっては色々面白いことができそう。

### 文字列処理系コマンド
diff, sed, wc, head, tail, uniq, sort, awk, tr, grep など。

ExcelでVLOOKUPとかするより、さっさとcsv出力して、これらのコマンドをパイプでつなげてゴリゴリやる方が手っ取り早かったりする。Windows側で作成したファイルとBusyboxで作成したファイルとで文字コード、改行コードが異なるので注意。

### かゆいところに手が届くコマンド
base64, sha1sum, gunzip, bunzip2, od など。

ちょっとbase64エンコード/デコードしたいなー、SHA1ハッシュ出したいなー、gzip/bzipのファイル展開したいなー、バイナリデータ確認したいなー、みたいなときに役立ちます。

## Windowsでシェルスクリプト
busybox-w32で受ける恩恵は色々ありますが、その中でも威力があるのはWindowsでシェルスクリプトが実行できることかと思います。

Linux使ってるときはサラッとシェルスクリプト書けるのに、それをWindowsでバッチファイルに移植しようとすると、簡単なものでも大抵挫折します。何故分岐やループみたいな基本的なところでこんなに悩まなければならないのか…。

``.sh``の拡張子に関連付けの設定をすればWindows上でもシームレスにシェルスクリプトが実行できます。

### Tips: バッチファイルからのシェルスクリプト
バッチファイルの中にシェルスクリプトを書くやり方をおまけで付けておきます。

こうすることで、.shの関連付けがなくても、busybox-w32のバイナリがあればバッチファイルを実行するだけでシェルスクリプトを実行することができます。他の人に渡したいときとかに便利です。

```dos
: <<EOF_BAT
@echo off
"%~dp0busybox.exe" bash "%~f0" %*
exit /b %ERRORLEVEL%
EOF_BAT
# ↓ここからシェルスクリプト
```

ファイルの先頭にこのおまじないを書いて、この下から続けてシェルスクリプトを書いて、拡張子は.batで保存します。このバッチファイルと同じフォルダにbusybox.exeを置いておけば、シェルスクリプトをバッチファイルとして実行させてやることができます。

我ながらうまいことできたなぁと思います（自画自賛）

# おわりに
実行ファイル1つダウンロードするだけで、ちょっとした作業をするのが何かと便利になります。シェルとLinuxコマンドが恋しいWindowsユーザーの方はぜひ活用してみてください。

この記事公開前には「busybox-w32」で検索しても日本語の情報はほぼ皆無でしたが、公開後おかげさまで色々なBlog等で取り上げていただき広まってきたようで嬉しい限りです。