Bash передаёт между командами текст, поэтому для фильтрации приходится собирать цепочки из grep, awk и sed. Nushell предлагает другой подход: ls, ps, open и http get возвращают таблицы и записи, а пайпы работают с полями, а не со строками. Это не POSIX-оболочка и не замена /bin/sh, но для интерактивной работы с данными она удобнее.
Идея: данные вместо текста
В Nushell у значения есть тип: список, запись, таблица, число, дата, размер файла. Команда ls возвращает таблицу с колонками name, type, size и modified. Дальше можно писать where size > 10mb, select name size или sort-by modified — без разбора вывода регулярками.
Внешние программы остаются доступными. Их вывод — строка или поток строк, который при необходимости превращают в таблицу через lines, parse, from json или from csv. Обратное преобразование делают to json, to csv и save.
Установка и запуск
cargo install nu --locked
nu --version
command -v nu
nu
Официальный способ сборки — cargo; в дистрибутивах и Homebrew пакет тоже есть, поэтому проверьте brew install nushell, pacman -S nushell или dnf install nushell. После установки из cargo бинарник обычно лежит в ~/.cargo/bin/nu. Сначала запускайте nu внутри привычного shell, чтобы оценить синтаксис без риска.
Сделать Nushell оболочкой входа можно через chsh -s /usr/bin/nu, подставив путь из command -v nu. Путь должен быть указан в /etc/shells; для ~/.cargo/bin/nu его иногда добавляют вручную. Перед сменой shell полезно сохранить резервный вход в систему.
Первые таблицы
ls | where size > 10mb | sort-by size --reverse | first 10
ps | where cpu > 5 | select pid name cpu mem | sort-by cpu --reverse
Вторая команда заменяет привычную связку ps aux | grep и awk. where фильтрует строки по условию, select оставляет нужные колонки, sort-by сортирует. Числовые значения сравниваются как числа, а размеры вроде 10mb — как размеры, поэтому не нужно пересчитывать байты вручную.
Полезные команды для изучения: describe показывает тип значения, help commands перечисляет встроенные команды, help --find json ищет по справке. explore открывает интерактивный просмотрщик длинных таблиц.
Файлы, JSON и HTTP
open servers.json | get hosts | where env == "prod" | select name ip
open report.csv | where status != "ok" | group-by region | items {|region, rows| {region: $region, fails: ($rows | length)}}
http get https://api.github.com/repos/nushell/nushell | select stargazers_count forks_count
open определяет формат по расширению: JSON, CSV, TOML, YAML и XML разбираются в таблицы автоматически. get достаёт вложенное поле, where фильтрует, group-by собирает записи в группы, а items превращает группы в новые строки. Получается сводка без промежуточных файлов.
http get тоже возвращает разобранный JSON, если сервер отдал его с подходящим Content-Type. Результат можно сразу отфильтровать или сохранить: | save --force stats.json. Для CSV добавьте | to csv, для таблицы в терминале — | table --expand.
Разбор логов на практике
open access.log | lines | parse '{ip} - - [{date}] "{method} {path} {protocol}" {status} {bytes}' | where status == "200" | group-by path | items {|path, rows| {path: $path, hits: ($rows | length)}} | sort-by hits --reverse | first 10
Здесь lines разбивает файл на строки, parse извлекает именованные поля по шаблону, а дальше начинается работа с таблицей. Обратите внимание: parse возвращает строки, поэтому статус сравнивается со строкой "200". Если нужен диапазон, приведите поле к числу заранее: | into int status.
Для нерегулярных логов используйте parse --regex с именованными группами. Если шаблон не совпал, строка не попадёт в результат — это удобно для отбрасывания служебных сообщений. Проверить промежуточный результат можно через | first 3 или | to json.
Свои команды и скрипты
def top-cpu [limit: int = 5] {
ps | sort-by cpu --reverse | first $limit | select pid name cpu mem
}
top-cpu 3
Команды с именованными аргументами и значениями по умолчанию делают интерактивные однострочники повторяемыми. Функция может возвращать таблицу, а не печатать текст, поэтому её результат снова удобно фильтровать.
Скрипт начинается с shebang #!/usr/bin/env nu и может использовать те же пайпы. Например, отчёт по ошибкам сохраняется одной строкой: open report.csv | where status != "ok" | save --force failures.csv. Для запуска без интерактивной оболочки есть nu -c 'ls | length'.
Настройка и переход с bash
config nu
$env.config.table.mode = "rounded"
$env.config.show_banner = false
config nu открывает файл конфигурации, путь к которому хранится в $nu.config-path. Переменные окружения задаются через $env.NAME = "value", а не через export. Для временной установки значения на одну команду работает привычная запись FOO=bar command.
Не переносите bash-скрипты механически. В Nushell другой синтаксис условий, нет подстановки $(...) в прежнем виде, а перенаправление вывода делается через out> или save. Внешнюю команду можно вызвать явно через ^grep, если встроенная команда перекрывает имя.
Ограничения и чек-лист
- Nushell не POSIX-совместим: системные скрипты с
#!/bin/shна него переводить не нужно. - Не все внешние утилиты понимают таблицы — на границе используйте
to jsonилиto csv. - Плагины и часть команд устанавливаются отдельно; проверяйте
helpдля своей версии. - Для скриптов фиксируйте версию Nushell: синтаксис развивается, отдельные команды переименовываются.
- Перед сменой login shell проверьте путь в
/etc/shellsи оставьте резервный вход.
Чек-лист миграции: запустить nu рядом с bash; переписать самые частые однострочники на ls | where и ps | select; проверить работу с JSON и CSV; вынести повторяющиеся операции в def; только после этого менять оболочку входа.
Итог
Nushell стоит попробовать, если вы часто разбираете вывод команд, JSON, CSV и логи. Таблицы и типы убирают целый слой хрупких awk-выражений, а parse и http get закрывают типовые задачи без дополнительных утилит. Для системных скриптов и минимальных окружений оставьте bash или dash, а Nushell используйте как рабочую оболочку и инструмент анализа данных.