Coreutils for Windows
Microsoft Build 2026にて、Microsoft公式のCoreutils実装となる、Coreutils for Windowsが発表されました。
Coreutilsとは
Coreutilsとは、Linux系OSの操作で必須となる基本コマンド群を提供するパッケージです。ls や cp, rm 等、当たり前のように存在し、無くては困る基本コマンドたちがCoreutilsによって提供されています。Coreutilsは空気のような存在と言っても過言ではないでしょう。
Coreutilsには複数の実装があり、Linux系OSにおいて現時点で最も普及しているものは、GNUプロジェクトの実装によるGNU Coreutils でしょう。最近は、Rust言語によるGNU Coreutils互換の実装を目指したuutils/coreutilsというプロジェクトも。Ubuntuでは25.10以降GNU Coreutilsをuutils実装に置き換えたことでも話題になりました。他には、組み込み機器向けに省メモリを特徴としたBusyBox等の実装も存在します。BusyBoxは、Alpine Linuxベースのコンテナを通じて利用している方も多いでしょう。macOSでもFreeBSD由来の同種の基本コマンド群がデフォルトでインストールされています。
Coreutils for Windows は、Microsoftがuutils実装をベースとしてWindows向けにカスタマイズしたものです。
uutils実装およびその派生のCoreutils for Windowsを除いて、上で紹介した各実装は、GNU Coreutilsとの互換性を目指していないので、各種オプションや挙動に細かな差異が多くあります。
Coreutils for Windowsのメリット
Coreutils for Windowsのメリットは、端的に言うと、Linux系OSで使えるコマンドがWindowsネイティブでも (ある程度) そのまま使えるようになる、ということです。
Linux系OSでのシェル操作に慣れた人には、Windowsでも sort, grep, xargs 等おなじみのコマンドが利用できるのは非常に助かります。例えばエラーログの件数を数える以下のコマンドが、PowerShellでもCMD(コマンドプロンプト)でもそのまま動きます。
grep ERROR app.log | wc -l
厳密にはgrepやxargsはCoreutils本体ではなく、元々はそれぞれGNU Grep (uutils実装ではuutils/grep)、GNU Findutils (uutils実装ではuutils/findutils) という別パッケージで提供されるコマンドです。Coreutils for Windowsは、ありがたいことにこれらをまとめて1パッケージで提供しています。
環境差異を減らす
チーム内で開発環境を統一できない事情がある場合、異なるOSや環境が混在します。Windows、macOS、Ubuntu、CI/CD環境と、様々な実行環境に応じて、処理を分けて管理する必要があります。Coreutils for Windowsを使えば、環境差異を減らすことができます。
例として、環境変数を指定してプログラムを起動するという単純な操作を取り上げます。環境変数設定は、Bash、PowerShell、CMDで方法が異なるので、それぞれ手順を分けて管理する必要があり、管理コストが増えます。
APP_MODE=debug some-app
$env:APP_MODE="debug"; some-app
※さらにこの後環境変数をクリアする必要あり
set "APP_MODE=debug" && some-app
※さらにこの後環境変数をクリアする必要あり
Coreutilsではenvコマンドが利用できるので、以下のように手順をシンプルに共通化できます。
env APP_MODE=debug some-app
インストール方法
Coreutils for Windowsは、PowerShellやCMDから、標準のwingetを使って簡単にインストールできます。
winget install Microsoft.Coreutils
各コマンドは、デフォルトで C:\Program Files\coreutils\bin 配下にインストールされます。この中を見れば使用できるコマンドが確認できます。コマンドの実行ファイルが大量にありますが、各ファイルはハードリンクとなっており、すべて同一実体を指しています。起動時の名称により実行される処理が変わります。これは、BusyBoxでも採用されている形式です。
Coreutils for Windowsの注意点
Windows固有の違いは残る
Windows固有の注意点としてREADMEでは次のような差分が挙げられています。
| 項目 | 注意点 |
|---|---|
| 改行コード | WindowsのテキストファイルではCRLFがよく使われるため、$を使ったパターンマッチや正確なバイト数の扱いに影響することがある。 |
/dev/null |
Windowsでは/dev/nullではなくNULを使う。例: find . -name "*.log" > NUL
|
| POSIXシグナル |
SIGHUP、SIGPIPE、SIGUSRなどはWindowsには存在しない。Ctrl+CによるSIGINTは期待どおり動く。 |
| パス区切り |
/と\の両方を受け付けるが、一部のコマンドは\区切りの出力を返すことがある (典型例としてfindコマンド)。後続のパイプ処理に影響する可能性がある。 |
| ファイル権限 | WindowsはPOSIXのパーミッションビットではなくACLを使うため、find -permのような権限ベースの処理は挙動が異なるか、利用できない場合がある。 |
| シンボリックリンク | 新規作成にはDeveloper Modeまたは管理者権限が必要。既存のシンボリックリンクの読み取りは昇格なしで可能。 |
また、一部のコマンドは、Windowsでは意味がない、POSIX仕様に依存するため利用できない等の理由で、コマンド自体が意図的にドロップされています。
既存の同名のコマンドとの衝突
CMD、PowerShellには既存の同名コマンドがあり、Coreutilsのコマンドと衝突するものがあります。各挙動についてREADMEにまとめられています。状況は随時更新されるはずなので、最新の状況についてはそちらを参照してください。
まとめ
Microsoft公式のCoreutils for Windowsを紹介しました。WindowsネイティブのPowerShellやCMDから基本的なLinuxコマンドが利用できるようになります。注意点も一部ありますが、簡単に環境差異を減らすことができるので、開発作業の管理を効率化できるようになります。導入も簡単なので、ぜひ一度試してみてください。