Nushell
A new kind of shell where pipelines carry structured data instead of plain text — tables, lists, and records all the way down.
Nushell (or nu) is a modern shell that treats everything as structured data
rather than streams of text. Instead of grepping and awking your way through
plain-text output, you get real tables, lists, and records that you can filter,
sort, join, and transform with a consistent set of commands.
Features
- Structured pipelines — commands produce typed data (tables, lists, records) rather than raw text, making transformations predictable and composable
- Powerful built-in commands —
select,where,sort-by,group-by,joinand many more work uniformly across all data types - First-class data formats — can natively read and write JSON, YAML, TOML, CSV, SQLite, and more without external tools
- Cross-platform — works on Linux, macOS, and Windows with consistent behaviour everywhere
- Helpful error messages — detailed, friendly errors with source spans that point exactly to the problem
- Syntax highlighting and completions — ships with a fast, accurate completion engine and inline syntax colouring
- Scriptable — a full scripting language with custom commands, closures, modules, and type annotations
Installation
cargo install nu
Or via package managers:
# Debian / Ubuntu (Ubuntu 23.04+ / Debian 13+)
apt install nushell
# Fedora
dnf install nushell
# macOS
brew install nushell
# Arch Linux
pacman -S nushell
# Windows (winget)
winget install nushellUsage
# List files as a table
ls
# Filter to only large files, sorted by size
ls | where size > 1mb | sort-by size --reverse
# Parse JSON and query it
open package.json | get dependencies
# Fetch and explore remote data
http get https://api.github.com/repos/nushell/nushell | select name stargazers_count forks_count
# Group processes by status
ps | group-by status
# Work with CSV
open data.csv | where age > 30 | sort-by name | to csvScripting
Custom commands in Nushell look and feel like built-ins:
def greet [name: string, --loud (-l)] {
let msg = $"Hello, ($name)!"
if $loud { $msg | str upcase } else { $msg }
}
greet "world" --loud # => HELLO, WORLD!Configuration
Nushell's config lives in $nu.config-path (usually
~/.config/nushell/config.nu). You can set your prompt, define aliases, load
modules, and customise colours all in plain Nushell script — no special DSL
required.