Windows 向け Coreutils 登場
Windows 向け Coreutils が登場しました。Coreutils
Core Utilities は ls/cp/mv/rm コマンドなど、基本的なファイル操作やシェル操作、テキスト操作など、Linux の土台となる基本的なツールセットです。お馴染みのコマンド群ですね。
最近 Ubuntu が Rust 版 Core Utilities に移行したこともあり、Core Utilities に関し記憶に新しい方も多いのではないでしょうか。
Windows 版 Core Utilities
その Core Utilities の Windows 版 が登場しました。Windows でも Linux で使用しているコマンドとパイプラインをそのまま利用できます。
Windows 版 Core Utilities は Microsoft がメンテナンスしており、uutils coreutils や findutils、grep を Windows 向けに単一のマルチコールバイナリーとしてパッケージングしたものです。
マルチコールバイナリーとは、単一のバイナリーで Core Utilities のコマンド群を実行する方式です。
なぜ作った?
Windows 版 Core Utilities は、Linux や macOS、WSL、コンテナーと Windows 間で、移行をスムーズに行えるようにするために作られました。同じコマンド、フラグ、パイプラインが同じように動作するため、既存のスクリプトを変換せずとも、そのまま使用できます。
--help オプションのサポート
Windows 版 Core Utilities が提供する各コマンドは、完全な構文とオプションを表示する --help オプションをサポートしています。使い方がよく分からなかったり、使い方を確認したい時は、--help オプションを活用すると良いでしょう。
DOS 版 コマンドの移植も含まれる
従来の DOS で提供されている sort と find コマンドの移植版も含まれており、/ スタイルのオプション構文に依存している既存の CMD スクリプトでも、UNIX スタイルのバージョンと並行してそのまま動作するようになっています。PowerShell のバージョンについて
PowerShell を使用する場合、PowerShell 7.4 以降が必要です。推奨バージョンは、~ の解釈がサポートされている PowerShell 7.6 以降のバージョンです。
コマンドの一覧
Windows 版 Core Utilities が提供しているコマンドの一覧です。サポートしているコマンドと、サポートしていないコマンドがあります。
サポートしているコマンド一覧
Windows 版 Core Utilities でサポートしているコマンド一覧は、以下を参照してください。サポートしていないコマンド
POSIX の仕組みに依存するコマンドや、既存の Windows スクリプトと非互換になるコマンド、Windows で実用性のないコマンドは、搭載されていません。サポートされていないコマンドの一覧は、以下を参照してください。
Coreutils をインストールするには
Coreutils をインストールする方法です。WinGet でインストール
Coreutils のインストールは、WinGet(Windows Package Manager)を使う方法が最も簡単です。ターミナルから以下のコマンドを実行します。
winget install Microsoft.Coreutils
以上でインストールは完了です。
GitHub から直接ダウンロードも可能
他の方法としては、GitHub から直接ダウンロードする方法もあります。エイリアスを作るには
コマンドのエイリアスを作る方法です。コマンドのエイリアスを作ると、よく利用するコマンドやオプション付きコマンドを簡単に呼び出せるようになります。
PowerShell
PowerShell でエイリアスを作成する方法です。Set-Alias を使用する場合、以下のようにエイリアスを作成します。
Set-Alias ll 'ls'
オプション付きコマンドのエイリアスを作成したい場合は、$PROFILE に以下のように関数を定義してください。
function ll { ls -la --color=auto @args }
注意
PowerShell のエイリアス機能を使う場合、バイナリストリームの互換性で問題が発生する可能性があります。その場合 xargs や find など、パイプ処理が正常に動かないケースが発生します。
CMD
CMD でエイリアスを作成する方法です。doskey で以下のようにエイリアスを作成します。
doskey ll=ls -la $*
コマンドの衝突について
Windows 版 Core Utilitiesが提供するコマンドと、CMD や PowerShell が内蔵しているコマンドの一部が同じ名称のコマンドであり、これらのコマンドが衝突します。どのコマンドが実行されるのか
衝突するコマンドを実行した場合、シェルの種類や $PATH で指定されたパスの順番、そして PowerShell ではこれらに加えエイリアステーブルの状況により、実行されるコマンドが決定されます。衝突するコマンドの一覧
衝突するコマンドの一覧は、以下を参照してください。Windows 固有の注意点
Windows 固有の注意点です。CRLF 改行コード
歴史的に Windows ではテキストファイルの改行コードに CRLF(\r\n)が採用されてきました。その一方で Linux では、LF が採用されてきました。
多くのコマンドはこの違いを透過的に処理できますが、バイト単位の処理では \r が影響する場合があります。
例えば uniq コマンドは、改行コードが CRLF かつ最後の行に改行がない場合、直前の重複行と異なると判断することがあります。
/dev/null の代替
Windows に /dev/null はありません。Windows では /dev/null の代わりに、NUL を使用してください。
例えば以下のように記述します。
find . -name "*.log" > NUL
POSIX シグナルがない
SIGHUP や SIGPIPE、SIGUSR といった POSIX シグナルは利用できません。ただし Ctrl+C(SIGINT)は、想定通りに動作します。
パスの区切り文字
パスの区切り文字に /(Linux)と \(Windows)を利用できます。ただ一部のコマンドは / 区切りで結果を出力します。
そのためこのようなコマンドでは、後に続くパイプ処理で何かしら影響が出る可能性があります。
ファイルのパーミッション
Windows はファイルのパーミッション管理に ACL を利用しており、POSIX のパーミッション管理とは異なる仕組みを採用しています。そのため find -perm のようなパーミッションに依存する処理は動作結果が異なったり、利用できない場合があります。
シンボリックリンク
既存リンクの読み取りは、管理者権限がなくても読み取り可能です。リンクの新規作成には開発者モードもしくは管理者権限のターミナルが必要です。
開発者モードの設定方法は、以下を参照してください。
PowerShell 利用時の留意点
対話型 PowerShell セッションでは PSReadLine を利用しており、UNIX シェルもしくは CMD と似たような振る舞いをするように調整されています。ただしいくつか制限があります。
クォートされた式の扱いについて
クォートされた式の扱いが UNIX シェルもしくは CMD と似たような振る舞いをするように調整されています。例えば echo *.txt は条件に合う複数のファイル名を出力し、echo '*.txt' はそのまま *.txt を出力します。
エスケープ文字の制限
PowerShell のエスケープ文字は`(バッククォート)であり、\(バックスラッシュ)ではありません。そのため Bash で以下のように記述する場合、
find . \( -foo -bar \)
PowerShell では以下のように書く必要があります。
find . `( -foo -bar `)
エイリアスの制限
PowerShell が定義しているエリアスは無視されません。例えば Get-Command ls や Get-Help ls は、PowerShell の内蔵コマンドもしくはエイリアスが参照されます。
