クロスプラットフォームのスクリプトを書くたびに、Windowsはそれを壊します。grep、ls、sortと打つと、シェルはnot recognizedと見つめ返します。Git Bashに切り替え、次にWSLに切り替え、スクリプトをPowerShellに翻訳します。WindowsとLinuxのコマンドラインの間の「ベルリンの壁」はまだ存在しています。
Build 2026でMicrosoftはそれを壊しました — 少なくとも部分的に。Coreutils for Windowsは、VMもなく、互換性レイヤーもなく、1つのwinget installで75以上のUnixコマンドをネイティブで提供します。
Microsoft Coreutilsとは#
Microsoft Coreutilsは、uutils/coreutils ↗、findutils ↗、grep ↗のMicrosoftメンテナンス版であり、Windows向けの単一のマルチコールバイナリとしてパッケージ化されています。これはRustで書かれています — 元のCコードベースのポートではなく、メモリ安全性を組み込んだモダンな再実装です。
[!NOTE] これはcompatibility shimではありません。
ls.exeはWindows NTシステムAPIを直接呼び出すネイティブなWin32 PEバイナリです。VMもなく、翻訳レイヤーもなく、bash.exeラッパーもありません。
インストール:
winget install Microsoft.Coreutilsbashそれだけです。75以上のコマンドがすぐにPATHに表示されます:ls、cat、cp、mv、rm、grep、find、sort、head、tail、wc、cut、tr、tee、sleep、pwd、hostname、xargs、diff、stat、touchなど。
アーキテクチャ:なぜ今回が異なるのか#
| ソリューション | アーキテクチャ | 起動時間 | メモリ | ファイルシステム |
|---|---|---|---|---|
| WSL2 | Hyper-V VM内のReal Linux kernel | 数秒 | GB単位 | 隔離(/mnt/c境界) |
| Git Bash | MSYS2 / MinGWエミュレーションレイヤー | 高速 | tens of MB | パス変換が必要 |
| Cygwin | POSIX compatibility DLLレイヤー | 高速 | tens of MB | パス変換が必要 |
| Coreutils | ネイティブWin32 PEバイナリ | <1ms | 数MB | 直接アクセス |
違いは構造的です。WSL2は5つの中間層を必要とします(Linux userspace → Linux kernel → Hyper-V → Windows)。Coreutilsは2つだけ(coreutils.exe → Windows NT Kernel)です。find . -name "*.rs" | xargs grep "fn main" | sort -uのようなパイプラインは、エミュレートされたLinuxプロセスではなく、実際のWindowsプロセスとして実行されます。
[!TIP] 例え:WSLは家の中に「Linuxの部屋」を建てるようなもの — Linuxツールを使うにはその部屋に歩いて入る必要があります。Coreutilsは家に「Linux語学力」を与えるようなもの — Windowsのリビングに立ったまま流暢にLinuxを話せます。
WSLとGit Bashとの比較#
WSL2#
WSL2はreal Linux kernelを実行します。それがスーパー能力であり、同時に制限でもあります。aptパッケージマネージャー、ネイティブのPython/Node/Rustツールチェーン、Docker DesktopなしのDocker、完全なPOSIX準拠が得られます。しかし:
- ファイルシステムの境界。
/mnt/c/のWindowsファイルはI/Oオーバーヘッドがあります。LinuxファイルはWindowsアプリケーションから隔離されています。 - VM起動コスト。 数秒かかります。即時ではありません。
- メモリ使用量。 GBレベルのベースライン。
- プロセスの隔離。 Windowsアプリケーションは、bridgingなしではWSLプロセスから直接パイプできません。
完全なLinux環境が必要な場合 — Linuxネイティブアプリケーションの実行、Linux向けのコンパイル、aptの使用、Dockerの実行 — WSL2がまだ正しい選択です。
Git Bash#
Git BashはGit for Windowsと一緒に同梱されます。Bash + MSYS2 + Unixツールのサブセットをバンドルしています。しかし:
- 別個のシェル環境です。Git Bashのコマンドを、コンテキストを切り替えずにネイティブのPowerShellやCMDセッションから使うことはできません。
- パス変換(バックスラッシュ vs フォワードスラッシュ、ドライブ文字)は、POSIXスクリプトを壊す微妙な動作の違いを生じます。
- ツールセットは限定的で、Windows 8以降deprecated ↗されたMSYS2互換レイヤーに依存しています。
Git BashはBash-centricなGitワークフローにはそのままの価値があります。しかし、既に使っているシェルで透過的にUnixコマンドを利用するには不十分です。
Coreutilsがギャップを埋める#
Coreutilsは、既存のPowerShellやCMDセッションにUnixコマンドを直接提供します — コンテキストスイッチなし、別個のシェルなし、パス変換なし。これらのコマンドはLinuxの同様のコマンドと同じ動作するため、クロスプラットフォームスクリプトは翻訳なしに引き継がれます。
動作するコマンドと動作しないコマンド#
Coreutilsは有用なサブセットを提供します。フルのGNU Coreutilsではありません。POSIXのみのツールは、Windowsに同等のカーネル機能がないため除外されています。
| Category | Commands |
|---|---|
| File operations | ls, cp, mv, rm, cat, touch, mkdir, ln, stat |
| Text processing | grep, sed, awk, cut, sort, uniq, wc, head, tail, xargs, tee |
| Search | find, locate |
| System info | date, hostname, uptime, pwd, whoami (via built-in) |
| Other | diff, basename, dirname, mktemp, printf, seq, tr, paste, split, comm, join, shuf |
意図的に除外されたコマンド:
chmod,chown,chroot,mkfifo,tty,users,who— Windowsに同等のない純粋なPOSIX概念kill— WindowsはPOSIXシグナル機構を欠いているdir,expand,more,timeout,whoami— Windows組み込みコマンドと競合(公式マトリクス ↗で🛑とマーク)
[!WARNING] PowerShellの競合は現実です。
cat、ls、sort、find、echoのようなコマンドにはPowerShellのaliasやcmdletがあります。PowerShellは次の順序で解決します:Alias → Function → Cmdlet → External executable。PATHの順序を調整するか、coreutils-manager disable <command>で優先度を制御してください。PowerShell 7.4+が必要です。
Windowsの注意点#
| Difference | Detail |
|---|---|
| CRLF line endings | Windowsのテキストファイルは\r\nを使います。CoreutilsツールはLinuxと異なる動作をする場合があります。必要に応じてsed -i 's/\r$//' fileで変換してください。 |
| File permissions | Windows ACLはPOSIX permissionsにマッピングされません。chmodとchownは欠落しています。 |
| Signals | SIGTERM/SIGKILLモデルがありません。killとtimeoutは利用できません。 |
| Case sensitivity | Windowsファイルシステムはデフォルトで大文字小文字を区別しません。Coreutilsはこれを尊重します。 |
| PATH order | PowerShell aliasがcoreutilsコマンドをシャドウする場合があります。 |
いつ何を使うか#
| Situation | 使うもの |
|---|---|
PowerShell/CMDでネイティブにgrep、ls、find、catを使う | Coreutils |
| LinuxとWindowsの両方で実行されるクロスプラットフォームシェルスクリプト | Coreutils(Linuxでもテスト) |
| 完全なLinux環境、package managers、Docker、Linuxネイティブアプリ | WSL2 |
| Bash-centric Gitワークフロー | Git Bash |
| Windows Terminalでの高速テキスト処理 | Coreutils |
| 完全なPOSIX準拠、syscalls、Cライブラリ | WSL2 |
AIコーディングエージェントのためのトークン最適化#
AI時代における予想外かつ極めて実用的なメリットがあります。それは、Windows上のCoreutilsがAIコーディングエージェント(Claude Code、Cursor、Copilot、Cline、Aiderなど)のコンテキストトークンを大幅に節約することです。
課題:PowerShellの出力は冗長すぎる(Verbose Output)#
AIエージェントがコードベースの調査やログ調査のためにWindows上でコマンドを実行すると、PowerShellはデフォルトで整形されたオブジェクトテーブル形式を返し、大量の余白、カラムヘッダー、メタデータを伴います。
# PowerShell Get-ChildItem (ls)
Get-ChildItem -Path . | Select-Object -First 3
# Output:
# Directory: C:\repo
# Mode LastWriteTime Length Name
# ---- ------------- ------ ----
# d---- 9/2/2026 10:15 AM src
# -a--- 9/2/2026 10:12 AM 1024 package.json
# -a--- 9/2/2026 10:14 AM 3420 README.mdpowershell一方、Coreutilsのlsやfindは、簡潔なUnixテキストストリームを出力します。
# Coreutils ls
ls -1
# Output:
# src
# package.json
# README.mdbashgraph TD
subgraph powershell_std [標準PowerShell]
A[AIエージェントコマンド] --> B[PowerShell Cmdlet]
B --> C[テーブル出力 + ヘッダー + 余白]
C --> D[~400 - 1,200 トークンがContextへ]
end
subgraph coreutils_clean [Coreutilsの活用]
E[AIエージェントコマンド] --> F[Coreutils Native Pipeline]
F --> G[フィルタ済みのUnixテキストストリーム]
G --> H[~40 - 150 トークンで済む]
end
事前フィルタリングパイプライン(Pre-filtering)による大幅なトークン削減#
Coreutilsがない場合、Windows上のAIエージェントはファイル全体をLLMのコンテキストに流し込んでからフィルタリングするか、複雑なPowerShell構文に苦戦します。Coreutilsがあれば:
grepとhead/tailによる高精度な行抽出: 5,000行のログファイル(約20,000トークン)を丸ごと読み込む代わりに、grep -n "FATAL" app.log | head -n 10を実行して必要な10行(約100トークン)だけをコンテキストに渡せます。wc -lによる即時カウント: テキスト内容をプロンプトに流すことなく、行数や一致件数のみを即座に集計できます。cutやawkによる列の切り出し: 不要なデータ列をシェル側で削ぎ落とし、必要なフィールドのみをコンテキストに渡します。- クロスプラットフォームで統一されたプロンプト: エージェントのシステムプロンプトで、Windows CMD/PowerShellとUnix Bashの構文を分岐させる必要がなくなります。
[!TIP] ELI5(10歳の子どもにもわかる説明): 500ページの分厚い本から特定の1文を探すようAIにお願いするとします。Coreutilsがないと、500ページ全部をコピーしてAIに渡すことになり、大量の紙とお金(トークン)が無駄になります。Coreutilsがあれば、ハサミでその1行だけを切り取ってAIに手渡すことができます。
結果として、Windows上でのAIエージェント実行ループにおけるコンテキストトークン消費を60%〜85%削減できます。
まとめ#
- Microsoft Coreutilsは75以上のUnixコマンドをWindowsにネイティブで持ち込みます — 基本のテキスト処理とファイル操作にはWSL、Cygwin、Git Bashは不要です。
- これはネイティブなWin32バイナリ(Rust/uutils)であり、VMでもエミュレーションレイヤーでもありません。
- AIエージェントのトークン大幅節約: 簡潔なテキストストリーム出力とパイプライン(
grep | head | cut)により、PowerShell cmdletと比較して60〜85%の無駄なトークンを削減します。 - 完全なLinux環境にはWSLを、Bash-centricなワークフローにはGit Bashを置き換えません。
- 「今すぐPowerShellで
grepが欲しい」と「完全なLinuxシステムが欲しい」の間のギャップを埋めます。 - ベルリンの壁はまだ完全には下りていません — でも橋が just openされました。