blog.dopana

Back

クロスプラットフォームのスクリプトを書くたびに、Windowsはそれを壊します。greplssortと打つと、シェルは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/coreutilsfindutilsgrepのMicrosoftメンテナンス版であり、Windows向けの単一のマルチコールバイナリとしてパッケージ化されています。これはRustで書かれています — 元のCコードベースのポートではなく、メモリ安全性を組み込んだモダンな再実装です。

[!NOTE] これはcompatibility shimではありません。ls.exeはWindows NTシステムAPIを直接呼び出すネイティブなWin32 PEバイナリです。VMもなく、翻訳レイヤーもなく、bash.exeラッパーもありません。

インストール:

winget install Microsoft.Coreutils
bash

それだけです。75以上のコマンドがすぐにPATHに表示されます:lscatcpmvrmgrepfindsortheadtailwccuttrteesleeppwdhostnamexargsdiffstattouchなど。

アーキテクチャ:なぜ今回が異なるのか#

ソリューションアーキテクチャ起動時間メモリファイルシステム
WSL2Hyper-V VM内のReal Linux kernel数秒GB単位隔離(/mnt/c境界)
Git BashMSYS2 / MinGWエミュレーションレイヤー高速tens of MBパス変換が必要
CygwinPOSIX 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に同等のカーネル機能がないため除外されています。

CategoryCommands
File operationsls, cp, mv, rm, cat, touch, mkdir, ln, stat
Text processinggrep, sed, awk, cut, sort, uniq, wc, head, tail, xargs, tee
Searchfind, locate
System infodate, hostname, uptime, pwd, whoami (via built-in)
Otherdiff, 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の競合は現実です。catlssortfindechoのようなコマンドにはPowerShellのaliasやcmdletがあります。PowerShellは次の順序で解決します:Alias → Function → Cmdlet → External executable。PATHの順序を調整するか、coreutils-manager disable <command>で優先度を制御してください。PowerShell 7.4+が必要です。

Windowsの注意点#

DifferenceDetail
CRLF line endingsWindowsのテキストファイルは\r\nを使います。CoreutilsツールはLinuxと異なる動作をする場合があります。必要に応じてsed -i 's/\r$//' fileで変換してください。
File permissionsWindows ACLはPOSIX permissionsにマッピングされません。chmodchownは欠落しています。
SignalsSIGTERM/SIGKILLモデルがありません。killtimeoutは利用できません。
Case sensitivityWindowsファイルシステムはデフォルトで大文字小文字を区別しません。Coreutilsはこれを尊重します。
PATH orderPowerShell aliasがcoreutilsコマンドをシャドウする場合があります。

いつ何を使うか#

Situation使うもの
PowerShell/CMDでネイティブにgreplsfindcatを使う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.md
powershell

一方、Coreutilsのlsfindは、簡潔なUnixテキストストリームを出力します。

# Coreutils ls
ls -1
# Output:
# src
# package.json
# README.md
bash
graph 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があれば:

  1. grephead/tailによる高精度な行抽出: 5,000行のログファイル(約20,000トークン)を丸ごと読み込む代わりに、grep -n "FATAL" app.log | head -n 10を実行して必要な10行(約100トークン)だけをコンテキストに渡せます。
  2. wc -lによる即時カウント: テキスト内容をプロンプトに流すことなく、行数や一致件数のみを即座に集計できます。
  3. cutawkによる列の切り出し: 不要なデータ列をシェル側で削ぎ落とし、必要なフィールドのみをコンテキストに渡します。
  4. クロスプラットフォームで統一されたプロンプト: エージェントのシステムプロンプトで、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されました。

References#