Nushell(コマンド名は nu)は、ls や ps の出力を文字列ではなく表として受け渡すシェルです。この記事では、2026年10月時点の最新版 0.116.1 の公式バイナリで実際にコマンドを流し、インストール手順、open・where・http get などの基本操作、bash から移るときに出るエラーと設定ファイルの場所までを、出力つきで整理します。
まとめ:Nushell 0.116の要点
- 最新版は 0.116.1(2026年10月4日公開)。まだ 1.0 前で、マイナー版はおおむね4〜8週間ごとに出ます。
- インストールは macOS・Linux なら
brew install nushell、Windows ならwinget install Nushell.Nushellかscoop install nu。起動コマンドはnuです。 - CSV・JSON・YAML を
openするだけで表になり、where・sort-by・group-byで絞り込みと集計ができます。jq や awk を挟みません。 - bash の構文はそのまま通りません。
&&はエラーになり、.shをsourceすることもできません。既存スクリプトはbash script.shとして呼び出します。 - POSIX 互換を目指していないため、いきなりログインシェルにせず、ターミナルの起動シェルだけを替えて試すのが安全です。
以下、特徴、インストール、基本コマンド、移行時のつまずき、設定、使い分けの順に説明します。
Nushellの特徴:出力が表として流れるシェル
Nushell は Rust で書かれた、Linux・macOS・Windows で動くシェルです。ライセンスは MIT で、0.116.1 の配布物にも MIT License の LICENSE ファイルが同梱されています。ソースは GitHub の nushell/nushell で公開されています。
bash(awk)とNushellで同じ処理を書いた差
違いは、注文データの CSV から status が FAIL の行を金額順に取り出す処理で比べると分かります。この例のように引用符内のカンマや改行を含まないCSVなら、bashでは列番号を指定して awk と sort に渡せます。
サンプルの orders.csv は、見出し行と5行のデータです。
id,customer,status,amount,date
1,tanaka,PAID,1200,2026-10-01
2,suzuki,FAIL,800,2026-10-01
3,tanaka,PAID,3400,2026-10-02
4,sato,FAIL,500,2026-10-03
5,suzuki,PAID,2100,2026-10-03
awk -F, 'NR>1 && $3=="FAIL"' orders.csv | sort -t, -k4 -n
4,sato,FAIL,500,2026-10-03
2,suzuki,FAIL,800,2026-10-01
Nushell では列名で書きます。CSV の見出し行がそのまま列名になり、amount は数値として並べ替えられます。
open orders.csv | where status == "FAIL" | sort-by amount
╭───┬────┬──────────┬────────┬────────┬────────────╮
│ # │ id │ customer │ status │ amount │ date │
├───┼────┼──────────┼────────┼────────┼────────────┤
│ 0 │ 4 │ sato │ FAIL │ 500 │ 2026-10-03 │
│ 1 │ 2 │ suzuki │ FAIL │ 800 │ 2026-10-01 │
╰───┴────┴──────────┴────────┴────────┴────────────╯
列の順番が変わっても Nushell 側の式は壊れません。awk 版は4列目が金額である前提に依存しています。CSV の列構成が変わりうるデータを日常的に触るなら、この差がそのまま保守の手間の差になります。
Nushellの型チェックと比較時のエラー
Nushell の値には型があり、describe で確認できます。上の CSV は table<id: int, customer: string, status: string, amount: int, date: string> と判定されました。数値の列を文字列と比べると、その場でエラーになります。
open orders.csv | where amount > "1000"
Error: nu::shell::operator_incompatible_types
x Types 'int' and 'string' are not compatible for the '>' operator.
bash の [[ ... ]] では、> なら文字列比較、-gt なら数値比較と演算子で決まり、取り違えてもエラーにはなりません。Nushell は値の型で判断して止まり、エラーは問題の位置に下線を引いて表示されます。
Nushell 0.x系の更新周期と破壊的変更
Nushell はまだ 0.x 系です。公式ブログの Road to 1.0 では、完全な安定性はまだ約束できず、必要な破壊的変更を続けると説明しています。2026年の公開ペースは GitHub Releases で次のとおりです。
| 版 | 公開日 |
|---|---|
| 0.110.0 | 2026-01-18 |
| 0.111.0 | 2026-03-01 |
| 0.112.1 | 2026-04-11 |
| 0.113.0 | 2026-05-24 |
| 0.114.0 | 2026-07-05 |
| 0.115.0 | 2026-08-15 |
| 0.116.0 | 2026-09-26 |
| 0.116.1 | 2026-10-04 |
ネット上の記事は書かれた時点の版に縛られます。たとえば HTTP 取得の fetch は 0.75(2023年1月)で http get に改名されており、0.116.1 で fetch を打つと 'fetch' has been removed from Nushell. Please use 'http get' instead. と表示されます。古い記事のコマンドが動かないときは、まず version で手元の版を確かめてください。
NushellのOS別インストール手順(Windows・macOS・Linux)
手順は公式の Installing Nu に沿っています。どの方法でも、入れたあとに nu と打てば起動し、version で版を確認できます。
macOS・Linux:Homebrew
brew install nushell
nu
version | select version
Nix を使っている場合は、公式トップページにある nix profile install nixpkgs#nushell でも入ります。Homebrew 版は公式プラグイン(後述の polars など)も同じ場所に入るので、追加作業なしで plugin add できます。
Windows:winget・Scoop
winget install Nushell.Nushell
winget upgrade Nushell.Nushell
scoop install nu
winget の既定はユーザー単位のインストールです。全ユーザー向けに入れたいとき、公式トップページは --scope machine を案内していますが、インストール手順のページは --scope は非対応と明記し、代わりに winget install Nushell.Nushell --override 'ALLUSERS=1' を示しています。手順書に書くなら、こちらの書き方に合わせるのが確実です。Windows で PowerShell と並べて使う場合は、PowerShellのインストール手順(7.6 LTS)もあわせて確認してください。
Debian・Ubuntu・Fedora:Furyリポジトリ
Debian・Ubuntu では、公式が案内する Gemfury の APT リポジトリを登録してから入れます。
wget -qO- https://apt.fury.io/nushell/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/fury-nushell.gpg
echo "deb [signed-by=/etc/apt/keyrings/fury-nushell.gpg] https://apt.fury.io/nushell/ /" | sudo tee /etc/apt/sources.list.d/fury-nushell.list
sudo apt update
sudo apt install nushell
Fedora・Rocky Linux は https://yum.fury.io/nushell/ を yum のリポジトリに足して sudo dnf install -y nushell で入ります。Alpine では、root権限で https://alpine.fury.io/nushell/ を /etc/apk/repositories に追加し、apk update の後に apk add --allow-untrusted nushell を実行します。WSL2 の Ubuntu に入れる場合も同じ手順で、WSL 自体の準備は WSL2の仕組みとインストール手順にまとめています。
バイナリ直接・cargo・Docker
パッケージマネージャを使わない場合は、GitHub Releases から OS ごとの tar.gz か zip を取ります。0.116.1 には macOS(x86_64・aarch64)、Windows(zip・msi)、Linux(gnu・musl、x86_64・aarch64・armv7・riscv64 など)の配布物と SHA256SUMS が並んでいます。展開すると nu 本体と nu_plugin_polars などのプラグインが同じフォルダに入っています。
shasum -a 256 nu-0.116.1-x86_64-apple-darwin.tar.gz
grep x86_64-apple-darwin SHA256SUMS
Rust の環境があれば cargo install nu --locked でも入りますが、この方法では公式プラグインが付いてきません。必要なものを cargo install nu_plugin_polars --locked のように別に入れ、本体と同じ版にそろえる必要があります。コンテナで試すだけなら ghcr.io/nushell/nushell:latest-alpine のイメージを docker run -it --rm で起動できます。
基本コマンドの実行例:ls・open・where・http get
ここから先の出力は、すべて 0.116.1 で実行した結果です。サンプルは前述の orders.csv と、次の app.json です。
{"name":"api","version":"1.4.2","deps":{"axum":"0.8","serde":"1.0"},"replicas":3}
ls・psの出力の絞り込みと並べ替え
ls の結果は name・type・size・modified の列を持つ表です。size はファイルサイズ型なので、1kb のような単位つきの値とそのまま比べられます。
ls | where size > 1kb | select name size
╭───┬─────────┬────────╮
│ # │ name │ size │
├───┼─────────┼────────┤
│ 0 │ big.bin │ 5.0 kB │
╰───┴─────────┴────────╯
プロセス一覧も同じで、ps | sort-by mem --reverse | first 3 | select pid name mem とすればメモリ使用量の上位3件が出ます。grep や head を組み合わせる代わりに、where・sort-by・first を並べるのが Nushell の基本形です。
CSV・JSON・YAMLの読み込み・集計・更新
open は拡張子を見て自動で解析します。集計は group-by と math sum で書けます。
open orders.csv | group-by customer --to-table | each {|g| {customer: $g.customer, total: ($g.items.amount | math sum)}}
╭───┬──────────┬───────╮
│ # │ customer │ total │
├───┼──────────┼───────┤
│ 0 │ tanaka │ 4600 │
│ 1 │ suzuki │ 2900 │
│ 2 │ sato │ 500 │
╰───┴──────────┴───────╯
JSON の設定ファイルは、get で値を取り出し、update で書き換えて save で保存します。to yaml を挟めば形式の変換も1行です。
open app.json | get deps
open app.json | update replicas 5 | save -f app2.json
open app.json | to yaml
save は既存ファイルがあると止まるので、上書きするときは -f を付けます。jq で同じことをする場合の書き方は jqコマンドの使い方と見比べると、どちらが手に合うか判断しやすくなります。
外部コマンド出力の表への変換
git や docker のような外部コマンドの出力は、Nushell から見ればただの文字列です。表として扱うには変換を1段挟みます。
^printf "a=1\nb=2\n" | lines | parse "{key}={value}"
╭───┬─────┬───────╮
│ # │ key │ value │
├───┼─────┼───────┤
│ 0 │ a │ 1 │
│ 1 │ b │ 2 │
╰───┴─────┴───────╯
行ごとに分けるのが lines、パターンで列を切り出すのが parse、空白区切りの見出しつき出力(macOS・Linuxの ^ps -o pid,comm など)をそのまま表にするのが detect columns、JSON を出す CLI なら from json です。先頭の ^ は、同名の内部コマンドではなく PATH 上の外部コマンドを呼ぶ指定で、Nushell の ls ではなく OS の ls を使いたいときに ^ls と書きます。
http getによるAPI呼び出しとJSON処理
Nushell には HTTP クライアントが入っていて、JSON のレスポンスは内容に応じてレコード・リスト・表などに変換されます。GitHub API から直近のリリースを取ると次のとおりです。
http get https://api.github.com/repos/nushell/nushell/releases?per_page=5 | select tag_name published_at
╭───┬──────────┬──────────────────────╮
│ # │ tag_name │ published_at │
├───┼──────────┼──────────────────────┤
│ 0 │ 0.116.1 │ 2026-10-04T15:26:13Z │
│ 1 │ 0.116.0 │ 2026-09-26T20:11:49Z │
│ 2 │ 0.115.1 │ 2026-08-23T09:46:06Z │
│ 3 │ 0.115.0 │ 2026-08-15T21:18:17Z │
│ 4 │ 0.114.1 │ 2026-07-11T18:15:05Z │
╰───┴──────────┴──────────────────────╯
POST は http post --content-type application/json で送れます。curl と jq の組み合わせを1つのパイプラインに置き換えられるのが、API の確認作業で Nushell を使う一番の理由です。
よく使うコマンドの早見表
0.116.1 を設定なし(nu -n)で起動したときの help commands | length は 534 で、そのうち filters カテゴリが 95 個です。最初に覚えるのは次のあたりで足ります。
| コマンド | 用途 |
|---|---|
open / save |
ファイルを読む・書く |
where |
条件で行を絞る |
select / get |
列を選ぶ・値を取り出す |
sort-by / first |
並べ替える・先頭を取る |
group-by / math sum |
グループ化と集計 |
each |
各行に処理をかける |
update / insert |
列の値を変える・足す |
describe |
型を確認する |
help コマンド名 |
使い方を表示する |
引数やオプションが分からなくなったら help where のように打てば、端末内で例つきの説明が出ます。
bashから移るときにつまずく点
Nushell は bash の上位互換ではありません。公式の Coming from Bash に対応表がありますが、実際に打って最初に止まるのは次の3つです。
&&・||の非対応と代替構文
echo a && echo b
Error: nu::parser::shell_andand
x The '&&' operator is not supported in Nushell
help: use ';' instead of the shell '&&', or 'and' instead of the boolean '&&'
コマンドを続けて実行するなら ;、失敗したときだけ別の処理をするなら try { ... } catch { ... } で書きます。Nushell の ; は bash の ; と違い、前のコマンドが失敗すると後ろは実行されません。
外部コマンド失敗時の停止と終了コードの取得
^false; print $"code=($env.LAST_EXIT_CODE)" を nu -c で実行すると、print は実行されず終了コード1で抜けます。公式の対応表でも、bash の set -o pipefail 相当が既定の動作とされています。終了コードを見て分岐したいときは、complete で受けます。
^ls nonexist | complete
╭───────────┬─────────────────────────────────────────╮
│ stdout │ │
│ stderr │ ls: nonexist: No such file or directory │
│ exit_code │ 1 │
╰───────────┴─────────────────────────────────────────╯
complete は stdout・stderr・exit_code を1つのレコードにまとめるので、| get exit_code で数値として取り出せます。
bashスクリプトのsource非互換と外部実行
export FOO=bar と書いた x.sh を source x.sh すると、nu::parser::unexpected_keyword で止まります。Nushell の source が読めるのは Nushell の構文だけです。既存のシェルスクリプトは bash script.sh または ^bash -c "..." として外部コマンドで呼べば動きます。nvm のように、シェル関数として読み込む前提のツールは Nushell からは使えないので、Node.js のバージョン管理などは mise のような外部コマンド型のツールに寄せると移行が楽になります。
よく使う書き方の対応は次のとおりです(公式対応表から抜粋)。
| bash | Nushell |
|---|---|
export FOO=BAR |
$env.FOO = "BAR" |
echo $? |
$env.LAST_EXIT_CODE |
cmd > /dev/null |
cmd | ignore |
cmd 2>&1 | less |
cmd o+e>| less |
${FOO:-fallback} |
$env.FOO? | default "fallback" |
alias s="git status -sb" |
alias s = git status -sb |
for i in $(seq 1 10) |
for i in 1..10 { print $i } |
bash -c コマンド |
nu -c コマンド |
Nushellの設定ファイル・PATH・プロンプト
設定は Configuration の章に沿って、config.nu に書きます。
config.nuの場所と開き方
起動時は env.nu → config.nu → autoload ディレクトリの *.nu → ログインシェルのときだけ login.nu の順に読まれます。env.nu は以前は環境変数用でしたが、現在の公式の推奨は、環境変数も含めて config.nu と autoload ディレクトリにまとめる書き方です。0.101.0(2024年12月)以降は既定値入りの $env.config が最初から用意されるので、設定全体を1つのレコードで書き直す必要もなくなりました。
| OS | 既定の設定ディレクトリ |
|---|---|
| Linux | ~/.config/nushell |
| macOS | ~/Library/Application Support/nushell |
| Windows | %APPDATA%\nushell |
場所を覚えなくても、$nu.config-path で実際のパスが出ます。config nu で既定のエディタが開き、config nu --doc で設定項目の説明を確認できます。config nu --default は内部の設定ファイルを表示するコマンドで、既定値の一覧ではありません。XDG_CONFIG_HOME を設定していると、その配下の nushell が使われます。
PATHへのディレクトリ追加と起動メッセージの非表示
use std/util "path add"
path add "~/bin"
$env.config.show_banner = false
path add は PATH の先頭に足し、~ を展開して入れます。$env.PATH ++= ["~/bin"] でも外部コマンドは見つかりますが、$env.PATH | last で見ると ~/bin のまま入っています。どちらでも動きますが、表示と実体を一致させたいなら path add を使ってください。Windowsでは通常 $env.Path と表示されますが、Nushellでは環境変数名の大文字・小文字を区別せず参照できます。
カスタムコマンドとプロンプト
よく使う処理は def で型つきの引数を持つコマンドにできます。
def fails [file: path, --min: int = 0] {
open $file | where status == "FAIL" and amount >= $min
}
fails orders.csv --min 600
この例では id=2 の1行だけが返りました。--min に文字列を渡すと型エラーになるので、bash の関数より引数の取り違えに強くなります。プロンプトは組み込みのもので足りますが、zsh などと見た目をそろえたいなら Starship が Nushell に対応しています。
プラグインの登録と読み込み:plugin addとplugin use
公式が保守するプラグインには、DataFrame 処理の polars、XML・JSON・HTML を照会する query、Git の状態を構造化して返す gstat、追加のファイル形式を扱う formats があります。以前の組み込み dataframe 機能は 0.93.0 で polars プラグインに移り、0.94.0 で削除されました。手順は Plugins の章のとおりです。
# 対話プロンプトで1行ずつ実行します。一括貼り付けやスクリプト化はしません。
# Windowsでは登録するファイル名をnu_plugin_polars.exeにします。
plugin add nu_plugin_polars
# 登録完了後、次の入力として実行します。
plugin use polars
open orders.csv | polars into-df | polars group-by customer | polars agg (polars col amount | polars sum) | polars collect
plugin add は初回登録時に加え、プラグイン更新後にも再実行します。登録情報は設定ディレクトリの plugin.msgpackz に記録され、次回の起動からは自動で読み込まれます。0.116.1 の配布物に同梱された polars を登録したところ、plugin list の版は本体と同じ 0.116.1 でした。公式は本体を更新したらプラグインも更新するよう求めているので、cargo で入れた場合はプラグインも同じ版に上げてください。
Nushellの既定シェル化の判断基準とCIでの運用
公式の Default Shell は、Nushell が POSIX 準拠を目指していないこと、ログインシェルが POSIX 互換である前提のプログラムで問題が起きうることを警告しています。結論から言うと、まずはターミナルの起動シェルだけを替え、ログインシェル(chsh)は替えないのが安全です。
ターミナルの起動シェルの変更
iTerm2 は Profiles の Command を Custom Shell にして nu のパスを入れ、Windows Terminal は新しいプロファイルのコマンドラインに nu.exe のパスを入れて既定のプロファイルにします。zsh を残したまま切り替えたい場合は、~/.zlogin などで exec nu を呼ぶ方法もあります。この方法なら、ログインシェルの profile で設定された環境変数を引き継いだまま Nushell が起動します。ターミナル側の設定は iTerm2の設定や WezTerm の設定の記事も参考になります。
ログインシェルにしないほうがよい場面
- チームで共有する手順書やスクリプトが bash 前提で、コピー&ペーストで実行する運用になっている。
- VS Code などのエディタが、ログインシェルを起動して環境変数を読み取る構成になっている。
- nvm・pyenv の init のように、シェルの rc ファイルに書き込む前提のツールに頼っている。
どうしてもログインシェルにするなら、~/.bash_profile や ~/.zprofile で設定していた環境変数を login.nu に移す必要があります。bash 側でどのファイルに何を書いていたかは .bashrcと.bash_profileの読み込み順で確認できます。/etc/shells に nu のパスが無いと chsh は拒否されます。
GitHub Actionsでの導入とバージョン指定
GitHub Actions では hustcer/setup-nu で Nushell を入れ、各ステップに shell: nu {0} を指定します。2026年10月時点のアクションの最新版は v3.28 です。
- uses: hustcer/setup-nu@v3
with:
version: "0.116.1"
- run: open package.json | get version
shell: nu {0}
version は必ず引用符で囲みます。setup-nu の README にあるとおり、0.90 と書くと YAML が数値として読み、0.9 に変わってしまいます。ビルドやデプロイの出力を JSON で受けて判定するステップでは、bash と jq で書くより短く済みます。CI の設計そのものを見直したい場合は、DevOps・CI/CD導入支援でも相談を受けています。
PowerShell・bash・fishとの使い分け
| 観点 | Nushell | PowerShell | bash | fish |
|---|---|---|---|---|
| パイプで流れるもの | 表・レコード | .NET オブジェクト | テキスト | テキスト |
| JSON・CSV の扱い | 組み込み | ConvertFrom-Json 等 | jq等の外部ツール | jq等の外部ツール |
| POSIX 互換 | なし | なし | あり | なし |
| 既存 .sh の実行 | bash 経由 | bash 経由 | そのまま | bash 経由 |
| 安定性 | 0.x | 7.6 LTS | 成熟 | 成熟 |
データを触る対話作業が多いなら Nushell、Windows の管理作業や .NET の資産があるなら PowerShell、配布して誰でも動かすスクリプトは bash、という分け方が現実的です。補完を主目的にfishを使っていて、構造化データを扱う必要がなければ、そのまま使い続ける判断を勧めます。Nushell を採用するなら、対話シェルと手元の作業スクリプトに限り、CI やサーバー上のスクリプトは版を固定して使うのが、0.x の破壊的変更と付き合う現実的な線です。
Nushellに関するよくある質問
Nushellは無料で使えますか?
使えます。MIT ライセンスのオープンソースで、商用利用も無料です。ソースと配布物は GitHub の nushell/nushell リポジトリにあります。
Nushellの最新バージョンはいくつですか?
2026年10月18日時点の最新は 0.116.1(2026年10月4日公開)です。1.0 にはまだ達していません。手元の版は version で確認できます。
PowerShellとNushellはどちらを選べばよいですか?
Windows の管理や Active Directory・Azure の操作が中心なら PowerShell、OS をまたいで CSV・JSON・API のデータを触ることが多いなら Nushell が向いています。両方入れて使い分けても衝突はしません。
Nushellのスクリプトはどう実行しますか?
拡張子 .nu のファイルに書き、nu script.nu で実行します。1行だけなら nu -c "ls | length" のように渡せます。bash のスクリプトとは構文が違うので、既存の .sh は書き換えるか bash で呼び出します。
既定の設定(default config)に戻すにはどうしますか?
設定を読み込まない状態は nu -n で起動すると確認でき、そのセッションで $env.config を見れば既定の設定値が分かります。config.nu を空にしても env.nu や autoload ディレクトリの *.nu は読み込まれるので、元に戻すならそれらも見直します。設定ファイルの場所は $nu.config-path で確認してください。