Microsoft Coreutils for Windows revives Unix command comfort

For decades, people have typed familiar Unix commands like ls, cat, grep, and awk in Windows terminals—sometimes with workarounds, sometimes with compatibility layers, and sometimes by running Linux itself. Now Microsoft is pushing Coreutils for Windows, a nat
When someone types ls on Windows and expects a clean directory listing, the moment can feel almost unfair. The command is simple. The frustration isn’t. For much of personal computing’s history. Unix and Windows didn’t just differ technically—they sat on opposite sides of a cultural border. Unix users had pipes. small composable tools. shell scripts. make. sed. awk. grep. tar. and the idea that everything was a file. Windows users had drive letters. backslashes. COMMAND.COM or cmd.exe. and an API that didn’t care much about POSIX.
Yet the demand never really went away. Programmers wanted build scripts to match across environments. Administrators missed grep and awk. Companies trying to port large Unix applications to NT wanted a path that didn’t always require rewriting everything.
The attempts that followed didn’t fall into one neat solution. They formed a long, strange history of Unix-on-Windows layers, toolkits, and “almost-but-not-quite” compatibility.
Coreutils for Windows lands with that history still unfinished—because the real trouble isn’t listing files. It’s everything the Unix command line assumes around the tools.
The easy part looks easy
Open a file, copy bytes to standard output—that’s cat, right?. Even ls is straightforward if you rely on Windows directory APIs. Everyday Unix commands such as cp, mv, rm, mkdir don’t appear mysterious either. Pipes aren’t completely foreign to Windows. and a lot of the command set can be ported as ordinary Win32 console programs with enough patience.
But not everything translates cleanly. The biggest fracture is fork(). In Unix, a process can clone itself. The child gets a copy of the parent’s address space, open file descriptors, environment, signal state, and more. Modern kernels make this efficient with copy-on-write memory, but the programming model is old and deeply baked into Unix. Shells use it constantly. Servers use it. Build systems use it. Scripting languages assume it exists—at least, they assume the surrounding environment behaves as though it does.
Windows process creation is different. CreateProcess() starts a new program. That model can be reasonable—until someone tries to implement a POSIX shell that forks. redirects file descriptors. adjusts the environment. and then starts another program. At that point, the mismatch becomes extreme and the shell has to do strange things to fake Unix behavior.
Commercial Unix tools: MKS
One of the early commercial answers came from the MKS Toolkit, originally from Mortice Kern Systems. MKS brought Windows users a pile of familiar commands, shells, and development tools. It wasn’t just ls and friends. The toolkit included ksh. vi. grep. find. awk. make. and many utilities needed to move scripts and build procedures between Unix and Windows. Even today. PTC MKS documentation describes it in that same spirit: Unix shells and hundreds of commands aimed at interoperability with Windows.
MKS was attractive because it didn’t insist Windows should pretend it was Unix. Windows was still Windows. Instead, users got a Unix-flavored toolbox that could operate in a Windows environment. For many people. that was enough: write scripts. run text processing. drive builds. and avoid learning three different syntaxes for the same job.
A more ambitious attempt: UWIN
Then came a project with a bolder goal—UWIN, from AT&T Bell Labs. UWIN stood for Unix for Windows. and it was built as a Unix interface layer on top of Windows NT and Windows 95. using libraries. headers. and commands. In 1997. David Korn—known for KornShell—published a USENIX paper describing the aim as building an open environment rich enough to serve as both a development and an execution environment. with nearly all of the X/Open Release 4 headers. interfaces. and commands.
The appeal was obvious: if you have Unix software, you want compatibility. The difficulty was obvious too. File permissions, symbolic links, signals, terminals, process groups, device files, pathnames, and fork() all carry edge cases. Even when the common case works, uncommon cases can consume years.
Cygwin’s promise—and its fork problem
Cygwin became the go-to answer for people who wanted GNU tools and a fairly complete POSIX environment on Windows. It uses a different model than compiling ls.exe as a native Windows program. Cygwin provides a POSIX compatibility DLL. Programs built for Cygwin call into that layer, and the layer translates Unix expectations into Windows operations.
That approach is strong because a lot of Unix software can be rebuilt and made to run. But Cygwin is explicit: it is not a way to run unmodified Linux binaries—you rebuild from source. It is also not a way to magically make ordinary Windows programs understand Unix signals and ptys.
Its weakest point, again, circles back to semantics. Cygwin’s own documentation calls out fork() as “particularly interesting” because it does not map well onto Win32. making it difficult to implement correctly. Cygwin’s fork() isn’t copy-on-write in the usual Unix sense. It has to do substantial work to recreate the parent process state inside a new Windows process.
Other branches: POSIX efforts, MSYS variants, Git for Windows
Not every path tried to recreate a Unix world from scratch. Microsoft’s POSIX and Interix efforts—later wrapped into Services for UNIX—were part of the same long-running story. MinGW and MSYS offered lighter-weight GNU-ish environments aimed at building native Windows programs. Git for Windows brought a useful subset of MSYS2-derived tools to an audience that may not have known or cared what MSYS2 was.
Still, the pattern held: either native Windows tools that looked like Unix commands, or compatibility layers that tried to preserve Unix behavior more deeply.
Then Microsoft shifted the center: WSL
Microsoft changed the game with WSL, the Windows Subsystem for Linux. WSL aimed to avoid endlessly translating Unix expectations into Windows expectations by letting Windows run a Linux userland. The first version translated Linux system calls. WSL 2 went further by using a real Linux kernel inside a managed lightweight VM.
Microsoft’s documentation describes WSL as a way to run a GNU/Linux environment. including most command-line tools and applications. directly on Windows without a traditional VM or dual boot. It also describes the WSL 1 versus WSL 2 comparison as a jump to fuller system call compatibility because WSL 2 uses the actual Linux kernel in a managed VM.
CoLinux and similar “kernels under Windows” projects existed before, with varying degrees of success, but WSL’s official placement in Windows made integration feel more real.
Now the pendulum swings again
And now it swings back—this time toward native command tooling inside Windows itself. Microsoft has introduced Coreutils for Windows, a Microsoft-maintained package based on the Rust uutils project. It delivers native Windows builds of familiar Unix-style tools packaged as a single multi-call binary. The package includes coreutils, findutils, and a GNU-compatible grep.
Microsoft describes the goal as making movement between Linux, macOS, WSL, containers, and Windows more frictionless—so the same commands, flags, and pipelines work more consistently.
Coreutils for Windows is not described as a replacement for WSL. It is also not trying to be Cygwin. In spirit, it leans back toward an older desire that made MKS attractive: sometimes you are in Windows, you are staying in Windows, and you still want tools that behave the way your fingers expect.
Full circle, but with official weight
There’s a line that feels hard to miss: the story is practically full circle back to MKS. The difference is official support.
That’s where the deeper issue lives. Running Unix commands on Windows isn’t one problem. It’s at least three problems in a trench coat.
First is the user-interface problem: people like the commands and want them available. That’s the easy win. Second is the scripting problem: people want pipelines, quoting, globbing, exit statuses, and command options to behave consistently. That’s harder. Third is the operating-system semantics problem: people want Unix programs to run as though Windows were Unix. That’s where friction concentrates.
Basic utilities are easy. The Unix command line is not just a bag of executables. It’s an ecosystem built on process inheritance, file descriptors, signals, terminals, pipes, path conventions, and fifty years of assumptions. Every attempt to bring Unix tools to Windows has drawn the boundary in a different place.
MKS drew it at commercial interoperability. UWIN tried to give Windows a serious Unix personality. Cygwin built a POSIX world inside a DLL. WSL brought Linux itself. Microsoft’s new Coreutils for Windows brings everyday commands back into native Windows space.
And it still starts the same way—someone sits down at a Windows terminal and asks a simple question: why can’t I list files on Windows with ls?
MISRYOUM Tech News Microsoft Coreutils for Windows Rust uutils Unix commands on Windows WSL Cygwin UWIN MKS Toolkit fork() POSIX compatibility grep ls cat
So does this mean my Windows will finally have “ls” now?
I don’t get why Microsoft didn’t just make Windows like Linux from the start. If I type ls and it works then cool, but if it needs some extra setup I’m not doing all that.
Wait, “Coreutils for Windows” sounds like it’s gonna replace Windows entirely? Like we’ll be living in some Unix shell forever? Also doesn’t Windows already have a grep? I swear I saw it in PowerShell once.
This seems like another Microsoft “finally” thing, like they’re catching up to the past. People have been typing weird workarounds for ages and now they’re calling it a product. If it’s compatibility layers, half the time it breaks anyway, and then everyone blames the user not the code.