すべてを生のテキストではなく構造化データとして扱うモダンなシェル。パイプラインはテーブル、レコード、リストで動作します — 単なる文字列ではありません。JSON、CSV、TOML、YAMLをネイティブに理解するシェルと考えてください。
| プラットフォーム | コマンド |
|---|
| macOS (Homebrew) | brew install nushell |
| Windows (Winget) | winget install nushell |
| Windows (Chocolatey) | choco install nushell |
| Windows (Scoop) | scoop install nu |
| Ubuntu/Debian | sudo apt install nushell(またはGitHubリリースからダウンロード) |
| Arch Linux | sudo pacman -S nushell |
| Fedora/RHEL | sudo dnf install nushell |
| Cargo (全プラットフォーム) | cargo install nu |
| Nix | nix-env -iA nixpkgs.nushell |
起動: 任意のシェルからnuを実行してNushellを起動。デフォルトシェルとして設定: chsh -s $(which nu)
Nushellのパイプラインは構造化データ(テーブル、レコード、リスト)を渡します、テキストではなく:
# 従来のシェル: テキスト → grep → awk → テキスト
# Nushell: テーブル → where → select → テーブル
ls | where size > 1mb | sort-by size --reverse | first 5
データ型: 文字列、整数、浮動小数点数、ブール値、日付、期間、ファイルサイズ、リスト、レコード、テーブル
| コマンド | 説明 |
|---|
ls | ディレクトリを構造化テーブルとしてリスト表示 |
ls -la | 長形式ですべてのファイル(隠しファイルを含む)をリスト表示 |
cd path/to/dir | ディレクトリを変更 |
cp source dest | ファイルまたはディレクトリをコピー |
mv source dest | ファイルを移動または名前変更 |
rm file | ファイルを削除 |
mkdir dirname | ディレクトリを作成 |
open file.json | ファイルを構造化データとして開く(形式を自動検出) |
open file.csv | CSVをテーブルとして開く |
open file.toml | TOMLをレコードとして開く |
save output.json | パイプライン出力をファイルに保存 |
cat file.txt | ファイル内容をテキストとして表示 |
ps | 実行中のプロセスをテーブルとして表示 |
sys | システム情報を表示 |
which command | コマンドの場所を検索 |
help commands | 利用可能なすべてのコマンドをリスト表示 |
help <command> | 特定のコマンドのヘルプを表示 |
| コマンド | 説明 |
|---|
ls | where size > 10mb | 10 MBより大きいファイルをフィルター |
ls | where name =~ "\.rs$" | ファイル名で正規表現によりフィルター |
ls | where type == "dir" | ディレクトリのみ表示 |
ls | where modified > 2day | 過去2日以内に変更されたファイル |
ls | select name size | nameとsize列のみ表示 |
ls | reject type | type列を削除 |
ls | get name | name列のみをリストとして抽出 |
ls | first 5 | 最初の5エントリを表示 |
ls | last 3 | 最後の3エントリを表示 |
ls | skip 10 | 最初の10エントリをスキップ |
ls | nth 0 2 4 | インデックスでエントリを選択 |
ls | length | エントリ数をカウント |
ls | uniq | 重複エントリを削除 |
| コマンド | 説明 |
|---|
ls | sort-by size | サイズで昇順にソート |
ls | sort-by size --reverse | サイズで降順にソート |
ls | sort-by name | アルファベット順にソート |
ls | group-by type | タイプでエントリをグループ化 |
ls | group-by {get name | path parse | get extension} | ファイル拡張子でグループ化 |
| コマンド | 説明 |
|---|
"hello world" | str upcase | 大文字に変換 |
"HELLO" | str downcase | 小文字に変換 |
" hello " | str trim | 空白をトリム |
"hello" | str contains "ell" | 文字列が部分文字列を含むかチェック |
"hello" | str replace "l" "L" | 文字を置換 |
"hello world" | split row " " | 文字列をリストに分割 |
["hello" "world"] | str join ", " | リストを文字列に結合 |
"hello" | str length | 文字列の長さを取得 |
"hello" | str starts-with "he" | 文字列のプレフィックスをチェック |
| コマンド | 説明 |
|---|
open data.json | get field_name | JSONのフィールドにアクセス |
open data.json | get nested.field | ネストされたフィールドにアクセス |
{name: "Alice", age: 30} | レコードを作成 |
[1 2 3 4 5] | リストを作成 |
[[name age]; [Alice 30] [Bob 25]] | テーブルを作成 |
$data | to json | JSONに変換 |
$data | to csv | CSVに変換 |
$data | to toml | TOMLに変換 |
$data | to yaml | YAMLに変換 |
$data | to md | Markdownテーブルに変換 |
| コマンド | 説明 |
|---|
[1 2 3 4] | math sum | 値の合計 |
[1 2 3 4] | math avg | 値の平均 |
[1 2 3 4] | math max | 最大値 |
[1 2 3 4] | math min | 最小値 |
[1 2 3 4] | math median | 中央値 |
ls | get size | math sum | リストされたファイルの合計サイズ |
1 + 2 | 基本的な算術演算 |
10 / 3 | 除算 |
2 ** 8 | 累乗 |
| コマンド | 説明 |
|---|
http get https://api.example.com/data | URLを取得してレスポンスを解析 |
http post https://api.example.com/data {key: "value"} | ボディ付きPOSTリクエスト |
fetch url | get field | 取得して特定のフィールドを抽出 |
# 変数(デフォルトで不変)
let name = "Alice"
let count = 42
let files = (ls | where size > 1mb)
# 可変変数
mut counter = 0
$counter += 1
# If/else
if $count > 10 { "big" } else { "small" }
# ループ
for file in (ls) { print $file.name }
ls | each { |row| $row.name | str upcase }
# カスタムコマンド(関数)
def greet [name: string] { $"Hello, ($name)!" }
greet "World"
| ファイル | 目的 |
|---|
$nu.config-path | メイン設定(config.nu) |
$nu.env-path | 環境設定(env.nu) |
# 設定ファイルの場所を表示
$nu.config-path
# 設定を編集
config nu # config.nuをエディタで開く
config env # env.nuをエディタで開く
# config.nu内
$env.config = {
show_banner: false # ウェルカムバナーを無効化
table: {
mode: rounded # テーブルスタイル: rounded、compact、thin、none
}
completions: {
algorithm: "fuzzy" # ファジータブ補完
}
history: {
max_size: 10000 # 保持する履歴エントリ数
file_format: "sqlite" # sqliteまたはplaintext
}
}
# プロジェクト内の最大ファイルを検索
ls **/* | where type == "file" | sort-by size --reverse | first 20
# JSON APIを解析してクエリ
http get https://api.github.com/repos/nushell/nushell | select stargazers_count forks_count
# 形式間で変換
open data.csv | to json | save data.json
# ログファイルを分析
open access.log | lines | parse "{ip} - - [{date}] \"{method} {path} {proto}\" {status} {size}"
| where status == "404" | group-by path | sort-by -r
# クイックシステム概要
sys | get host
ps | sort-by cpu --reverse | first 10
| 機能 | Bash/Zsh | Nushell |
|---|
| データモデル | テキストストリーム | 構造化テーブル |
| 出力の解析 | grep、awk、sed | 組み込みのwhere、select、get |
| JSON処理 | jqが必要 | ネイティブ(open file.json) |
| エラーハンドリング | 終了コード | リッチなエラーメッセージ |
| タブ補完 | 基本 | コンテキスト認識 |
| 型システム | なし | 整数、文字列、日付、サイズなど |
| 学習曲線 | 馴染みがある | 新しい構文を学ぶ必要がある |
| 外部コマンド | ネイティブ | 完全サポート |