(2018/11/17更新)
記事公開から3年経過し、WindowsにおけるLinuxコマンドの扱いについて取り巻く環境が変化してきたため内容をアップデートしました。合わせてWindows上でシェルスクリプトを実行するためのTipsも追加。
前置き
Linuxなどの環境を使いはじめて慣れてくると、シェルや各種Unix系コマンドの使いやすさが手放せなくなってきます。そんなときにWindowsでデータの編集や解析などを行おうとすると、大変不便に感じてしまいます。
Windowsにも元々コマンドプロンプトや、PowerShellといった環境はあります。しかしこれらを駆使してLinuxと同等のことがしたい、と思ったものの挫折した経験を持たれている方は少なくないのではないでしょうか。(私の場合は、コマンドプロンプトやバッチファイルの貧弱さではどうしようもなく。PowerShellは学習コストが高そうなため未だに食わず嫌いしてます…)
Windows上でLinuxの環境を利用するためにの方法として、Hyper-VやVMwareなどの仮想環境や、各種UnixコマンドのWindows用バイナリの詰め合わせであるCygwinなどがあります。しかし、ちょっとdiffやgrepを使いたいだけ、というようなシーンには大規模すぎて不向きです。
そんな中、最近ではWSL (Windows Subsystem for Linux) が提供され始め、以前よりもライトにLinux環境が使えるようになりました。とは言いながらも、WSLもやはりWin10環境でWSLを有効化して再起動して、ディストリビューションをインストールして…という準備が必要です。
- OSがWindows 10ではない
- 会社のPCで管理者権限がない(インストールができない)
- 他人のPC
- ディスク容量がカツカツ
…と言った環境ではやはりWSLも選択肢から外さざるを得ません。
そこでbusybox
前置きが長くなりましたが、ここではインストール作業不要で気軽にWindows環境でUNIX、Linuxのコマンドを利用する方法を紹介します。
利用するのは、 busybox-w32 です。
BusyBoxとは、主たるコマンドを単一のバイナリにまとめたもので、組み込み系のシステムでよく使われています。最近ではAndroid関連でもちょくちょく目にすることがあります。詳細はWikipediaをどうぞ。
busybox-w32は、その名のとおりBusyBoxをWindows環境にポートしたものです。
使い方
使い方は非常に簡単です。バイナリをダウンロードして、あとは煮るなり焼くなり使えます。
ダウンロード
以下のサイトからダウンロードできます。
ページの下の方、busybox.exeというリンクから最新バージョンがダウンロード可能です。
ファイルサイズは1MBもありません。インストーラーではなく実行ファイルそのものです。パスの通った場所に保存しておくと便利です。
引数なしで実行すると、バージョン情報、使い方、使えるコマンドの一覧が表示されます。※以下の実行結果は64bit版のものです
C:\busybox>busybox64.exe
BusyBox v1.30.0-FRP-2358-g25a1bcec7 (2018-09-11 08:30:51 BST) multi-call binary
(mingw64-gcc 7.3.0-1.fc28; mingw64-crt 5.0.2-2.fc27)
BusyBox is copyrighted by many authors between 1998-2018.
Licensed under GPLv2. See source distribution for detailed
copyright notices.
Usage: busybox [function [arguments]...]
or: busybox --list[-full]
or: busybox --install [DIR]
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, ash, awk, base64, basename, bash, bunzip2, busybox, bzcat, bzip2, cal, cat, chmod, cksum,
clear, cmp, comm, cp, cpio, cut, date, dc, dd, df, diff, dirname, dos2unix, dpkg-deb, du, echo, ed, egrep, env,
expand, expr, factor, false, fgrep, find, fold, fsync, ftpget, ftpput, getopt, grep, groups, gunzip, gzip, hd,
head, hexdump, id, ipcalc, kill, killall, less, link, ln, logname, ls, lzcat, lzma, lzop, lzopcat, man, md5sum,
mkdir, mktemp, mv, nc, nl, od, paste, patch, pgrep, pidof, pipe_progress, pkill, printenv, printf, ps, pwd,
realpath, rev, rm, rmdir, rpm, rpm2cpio, sed, seq, sh, sha1sum, sha256sum, sha3sum, sha512sum, shred, shuf,
sleep, sort, split, ssl_client, stat, strings, sum, tac, tail, tar, tee, test, timeout, touch, tr, true,
truncate, ttysize, uname, uncompress, unexpand, uniq, unix2dos, unlink, unlzma, unlzop, unxz, unzip, usleep,
uudecode, uuencode, vi, watch, wc, wget, which, whoami, whois, xargs, xxd, xz, xzcat, yes, zcat
使い慣れたコマンドが並んでいるかと思います。各コマンドを起動するには、busybox.exe
の第1引数にコマンドを渡します。その後ろにコマンドの引数を並べれます。また、ファイル名をリネームしてもそのコマンドとして使えます。本家BusyBoxと同じようにシンボリックリンクでも可能と思います。
シェルを使う
何かとかゆいところに手が届かないコマンドプロンプト。早速シェルを使いましょう。busybox sh -l
でログインシェルとして起動します。
起動したシェルでは、busybox-w32に含まれているコマンドはそのまま使えます。また、Cygwinと同じように、Windowsの実行ファイルもここから実行できます。DIR
などの内部コマンドを使いたいときは、cmd /c dir
などとして実行すればOKです。
個人的にお気に入りなコマンドたち
このコマンドまで使えちゃうんだ!とか、意外と便利な使い道があるコマンドを少し紹介。
ネットワーク関連コマンド
wget, whois, nc, など。
nc (netcat)も使えるのは結構感動だった。どれもWindows単体では実現できないので、意外と悩む。他にもftpgetとかftpputとかあるみたいだけど使ったことはない。
文字列処理系コマンド
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のバイナリがあればバッチファイルを実行するだけでシェルスクリプトを実行することができます。他の人に渡したいときとかに便利です。
: <<EOF_BAT
@echo off
"%~dp0busybox.exe" bash "%~f0" %*
exit /b %ERRORLEVEL%
EOF_BAT
# ↓ここからシェルスクリプト
ファイルの先頭にこのおまじないを書いて、この下から続けてシェルスクリプトを書いて、拡張子は.batで保存します。このバッチファイルと同じフォルダにbusybox.exeを置いておけば、シェルスクリプトをバッチファイルとして実行させてやることができます。
我ながらうまいことできたなぁと思います(自画自賛)
おわりに
実行ファイル1つダウンロードするだけで、ちょっとした作業をするのが何かと便利になります。シェルとLinuxコマンドが恋しいWindowsユーザーの方はぜひ活用してみてください。
この記事公開前には「busybox-w32」で検索しても日本語の情報はほぼ皆無でしたが、公開後おかげさまで色々なBlog等で取り上げていただき広まってきたようで嬉しい限りです。