Nushell

A new kind of shell where pipelines carry structured data instead of plain text — tables, lists, and records all the way down.

Screenshot of Nushell

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 commandsselect, where, sort-by, group-by, join and 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 nushell

Usage

# 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 csv

Scripting

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.