コマンド出力をテーブルとして扱い、型付きデータによるパイプライン、フィルタリング、クロスプラットフォームスクリプティングをサポートするモダンな構造化データシェル。
| コマンド | 説明 |
|---|
brew install nushell | macOSにHomebrewでインストール |
cargo install nu | crates.ioからインストール |
winget install nushell | Windowsにwingetでインストール |
sudo apt install nushell | Debian/Ubuntuにインストール |
pacman -S nushell | Arch Linuxにインストール |
nix-env -i nushell | NixOSにインストール |
nu | Nushellを起動 |
nu --version | インストール済みバージョンを表示 |
nu -c "ls" | 単一コマンドを実行して終了 |
nu script.nu | Nushellスクリプトファイルを実行 |
chsh -s /usr/bin/nu | Nushellをデフォルトシェルに設定 |
| コマンド | 説明 |
|---|
sys | システム情報の全体を表示 |
sys host | ホスト詳細を表示(名前、OS、カーネル) |
sys mem | メモリ使用量を表示 |
sys cpu | CPU情報を表示 |
sys disks | ディスク使用量を表示 |
sys net | ネットワークインターフェースを表示 |
sys temp | 温度センサーを表示 |
date now | 現在の日時を表示 |
date now | format date "%Y-%m-%d" | 現在の日付をフォーマット |
$nu.home-path | ホームディレクトリのパスを表示 |
$nu.os-info | OS詳細を表示 |
| コマンド | 説明 |
|---|
ls | ファイルを構造化テーブルとして一覧表示 |
ls -l | 詳細付きの長い一覧 |
ls -a | 隠しファイルを表示 |
ls **/*.rs | Rustファイルの再帰的glob |
ls | where size > 1mb | 1MBより大きいファイルをフィルタ |
ls | where type == dir | ディレクトリのみフィルタ |
ls | sort-by modified -r | 更新日時でソート(新しい順) |
ls | sort-by size -r | サイズ降順でソート |
ls | get name | ファイル名カラムのみ取得 |
| コマンド | 説明 |
|---|
ps | プロセスをテーブルとして一覧表示 |
ps | where cpu > 10 | CPU使用率10%超のプロセスを検索 |
ps | where name =~ "node" | 名前パターンでプロセスを検索 |
ps | sort-by mem -r | first 10 | メモリ使用量上位10プロセス |
ps | where pid == 1234 | PIDでプロセスを検索 |
| コマンド | 説明 |
|---|
help | 一般的なヘルプを表示 |
help commands | 利用可能な全コマンドを一覧表示 |
help ls | 特定コマンドのヘルプを表示 |
help operators | 利用可能な演算子を一覧表示 |
help escapes | 文字列エスケープシーケンスを表示 |
| コマンド | 説明 |
|---|
ls | select name size | 特定カラムを選択 |
ls | reject modified | 特定カラムを除外 |
ls | rename filename filesize | カラム名を変更 |
ls | first 5 | 最初の5行を取得 |
ls | last 3 | 最後の3行を取得 |
ls | skip 10 | 最初の10行をスキップ |
ls | length | 行数をカウント |
ls | reverse | 行の順序を逆にする |
ls | shuffle | 行の順序をランダム化 |
ls | flatten | ネストされたテーブルをフラット化 |
ls | columns | カラム名を一覧表示 |
| コマンド | 説明 |
|---|
ls | where size > 1mb | 比較でフィルタ |
ls | where name =~ "test" | 正規表現マッチでフィルタ |
ls | where name starts-with "src" | プレフィックスでフィルタ |
ls | where name ends-with ".md" | サフィックスでフィルタ |
ls | where type in ["file" "dir"] | 値リストでフィルタ |
ls | sort-by size -r | 降順ソート |
ls | sort-by name -i | 大文字小文字を区別しないソート |
ls | uniq-by type | カラムで重複を除去 |
ls | group-by type | カラム値で行をグループ化 |
| コマンド | 説明 |
|---|
ls | each { |it| $it.name } | 各行を変換 |
ls | par-each { |it| $it.name } | 並列で変換 |
ls | update size { |it| $it.size / 1kb } | カラム値を更新 |
ls | insert label { |it| $it.name + "-file" } | 新しいカラムを追加 |
ls | reduce -f 0 { |it, acc| $acc + $it.size } | 値を累積 |
ls | enumerate | インデックスカラムを追加 |
ls | window 3 | 3行のスライディングウィンドウ |
ls | zip [1 2 3] | 別のリストとzip |
ls | transpose | 行と列を入れ替え |
| コマンド | 説明 |
|---|
42 | 整数 |
3.14 | 浮動小数点数 |
"hello" | 文字列 |
true / false | ブール値 |
null | Null値 |
2024-01-15 | 日付 |
5sec / 3min / 2hr | 期間 |
1kb / 5mb / 2gb | ファイルサイズ |
0b1010 | バイナリリテラル |
0xff | 16進数リテラル |
| コマンド | 説明 |
|---|
[1 2 3] | リスト |
[1 2 3] | append 4 | リストに追加 |
[1 2 3] | prepend 0 | リストの先頭に追加 |
{name: "Alice", age: 30} | レコード |
{a: 1} | merge {b: 2} | レコードをマージ |
[[name age]; ["Alice" 30] ["Bob" 25]] | テーブルリテラル |
0..9 | 範囲(0から9) |
0..<9 | 排他的範囲(0から8) |
0..2..10 | ステップ付き範囲(0, 2, 4, 6, 8, 10) |
| コマンド | 説明 |
|---|
"42" | into int | 文字列を整数に変換 |
"3.14" | into float | 文字列を浮動小数点数に変換 |
42 | into string | 数値を文字列に変換 |
"true" | into bool | 文字列をブール値に変換 |
"2024-01-15" | into datetime | 文字列を日時に変換 |
1024 | into filesize | 数値をファイルサイズに変換 |
5 | into duration --unit sec | 数値を期間に変換 |
42 | into binary | 数値をバイナリに変換 |
[1 2 3] | into record | リストをレコードに変換 |
{a: 1} | into record | レコードに変換 |
| コマンド | 説明 |
|---|
open data.json | JSONファイルを開いてパース |
open data.csv | CSVファイルを開いてパース |
open data.yaml | YAMLファイルを開いてパース |
open data.toml | TOMLファイルを開いてパース |
open data.xml | XMLファイルを開いてパース |
open data.tsv | TSVファイルを開いてパース |
open data.sqlite | SQLiteデータベースを開く |
open file.txt | プレーンテキストとして開く |
open data.json | get users | 開いてデータ内をナビゲート |
| コマンド | 説明 |
|---|
"hello" | save hello.txt | 文字列をファイルに保存 |
ls | save files.json | テーブルをJSONとして保存 |
ls | save files.csv | テーブルをCSVとして保存 |
ls | save files.yaml | テーブルをYAMLとして保存 |
open data.json | to csv | JSONをCSVに変換 |
open data.csv | to json | CSVをJSONに変換 |
open data.json | save data.yaml | フォーマット間で変換 |
open data.csv | save -f data.csv | 既存ファイルを強制上書き |
"line1\nline2" | save -a log.txt | ファイルに追記 |
| コマンド | 説明 |
|---|
open file.txt | lines | ファイルを行に分割 |
open file.txt | lines | length | ファイルの行数をカウント |
open file.csv | where status == "active" | CSVの行をフィルタ |
open file.json | select name email | JSONからフィールドを選択 |
open file.json | to yaml | save file.yaml | JSONをYAMLに変換 |
glob "**/*.md" | each { |f| open $f } | マッチする全ファイルを開く |
| コマンド | 説明 |
|---|
"hello world" | str upcase | 大文字に変換 |
"HELLO" | str downcase | 小文字に変換 |
"hello" | str capitalize | 最初の文字を大文字に |
" hello " | str trim | 空白をトリム |
"hello" | str trim --char "h" | 特定の文字をトリム |
"hello" | str reverse | 文字列を反転 |
| コマンド | 説明 |
|---|
"hello world" | str replace "world" "nu" | 最初の出現を置換 |
"aabaa" | str replace -a "a" "x" | 全ての出現を置換 |
"hello world" | str replace -r '\w+' 'word' | 正規表現で置換 |
"hello world" | str contains "world" | 文字列が含まれるか確認 |
"hello world" | str starts-with "hello" | プレフィックスを確認 |
"hello world" | str ends-with "world" | サフィックスを確認 |
"hello world" | str index-of "world" | 部分文字列の位置を検索 |
| コマンド | 説明 |
|---|
"hello world" | split row " " | デリミタで分割 |
"a,b,c" | split row "," | CSV形式の文字列を分割 |
"hello" | split chars | 文字に分割 |
["hello" "world"] | str join " " | リストを文字列に結合 |
["a" "b" "c"] | str join "," | カンマで結合 |
"hello" | str length | 文字列の長さを取得 |
"hello world" | str substring 0..5 | 部分文字列を抽出 |
# 基本的な補間
let name = "World"
$"Hello, ($name)!"
# 式の補間
$"Total: (1 + 2 + 3)"
# 複数行文字列
$"Line 1
Line 2
Line 3"
# 生文字列(エスケープなし)
r#'C:\Users\path'#
| コマンド | 説明 |
|---|
def greet [name: string] { $"Hello, ($name)!" } | 基本的なカスタムコマンド |
def add [a: int, b: int] -> int { $a + $b } | 型アノテーション付きコマンド |
def greet [name = "World"] { ... } | デフォルトパラメータ付きコマンド |
def "git branches" [] { git branch | lines } | サブコマンドスタイルの名前 |
def --wrapped cmd [...rest] { ... } | 追加の引数を受け入れる |
| コマンド | 説明 |
|---|
let x = 42 | 不変変数 |
mut x = 0; $x = $x + 1 | 可変変数 |
const PI = 3.14159 | コンパイル時定数 |
if $x > 0 { "pos" } else { "neg" } | 条件式 |
match $x { 1 => "one", 2 => "two", _ => "other" } | パターンマッチング |
for item in [1 2 3] { print $item } | forループ |
while $x < 10 { $x = $x + 1 } | whileループ |
loop { if $x > 10 { break }; $x += 1 } | break付き無限ループ |
try { risky_op } catch { "failed" } | エラーハンドリング |
# フラグパラメータ付き関数
def greet [
name: string # 挨拶する名前
--excited (-e) # 感嘆符を使用
] {
if $excited {
$"Hello, ($name)!"
} else {
$"Hello, ($name)."
}
}
# 可変長パラメータ付き関数
def sum [...nums: int] -> int {
$nums | math sum
}
# パイプライン入力関数
def double-all [] {
each { |x| $x * 2 }
}
# 使い方: [1 2 3] | double-all
| コマンド | 説明 |
|---|
[1 2 3 4 5] | math sum | 値の合計 |
[1 2 3 4 5] | math avg | 値の平均 |
[1 2 3 4 5] | math min | 最小値 |
[1 2 3 4 5] | math max | 最大値 |
[1 2 3 4 5] | math median | 中央値 |
[1 2 3 4 5] | math stddev | 標準偏差 |
[1 2 3 4 5] | math variance | 分散 |
[1 2 3] | math product | 値の積 |
10 | math abs | 絶対値 |
10 | math sqrt | 平方根 |
2 | math round -p 2 | 精度を指定して丸め |
10 | math log 2 | 底2の対数 |
| コマンド | 説明 |
|---|
http get https://api.example.com/data | GETリクエスト |
http post https://api.example.com/data {name: "test"} | JSONでPOSTリクエスト |
http put https://api.example.com/data/1 {name: "updated"} | PUTリクエスト |
http delete https://api.example.com/data/1 | DELETEリクエスト |
http get url --headers [Accept application/json] | カスタムヘッダー付きGET |
http get url | get data | GETしてフィールドを抽出 |
port 8080 | ポートが使用中か確認 |
# JSON APIの取得と処理
let users = (http get "https://jsonplaceholder.typicode.com/users")
$users | select name email | first 5
# ヘッダーとボディ付きPOST
http post "https://api.example.com/items" {
name: "New Item"
price: 29.99
} --headers [Authorization $"Bearer ($env.API_TOKEN)"]
| コマンド | 説明 |
|---|
$nu.config-path | 設定ファイルのパスを表示 |
$nu.env-path | 環境設定ファイルのパスを表示 |
$nu.default-config-dir | 設定ディレクトリを表示 |
config nu | エディタで設定を開く |
config env | エディタで環境設定を開く |
| コマンド | 説明 |
|---|
$env.config.show_banner = false | 起動バナーを無効化 |
$env.config.buffer_editor = "vim" | Ctrl+O用のエディタを設定 |
$env.config.history.file_format = "sqlite" | SQLite履歴を使用 |
$env.config.history.max_size = 100_000 | 最大履歴エントリ数を設定 |
$env.config.completions.external.enable = true | 外部補完を有効化 |
$env.config.cursor_shape.emacs = "line" | カーソルの形状を設定 |
$env.config.footer_mode = "25" | 大きなテーブルのフッターを表示 |
$env.config.table.mode = "rounded" | テーブルの枠線スタイルを設定 |
| コマンド | 説明 |
|---|
$env.PATH = ($env.PATH | prepend "/usr/local/bin") | PATHに追加 |
$env.PATH = ($env.PATH | append "~/.local/bin") | PATHの末尾に追加 |
$env.EDITOR = "vim" | 環境変数を設定 |
alias ll = ls -l | コマンドエイリアスを作成 |
source ~/.config/nushell/custom.nu | 追加設定を読み込み |
# env.nu — 環境設定
$env.PATH = ($env.PATH | split row (char esep)
| prepend "/usr/local/bin"
| prepend ($env.HOME | path join ".cargo" "bin")
| append ($env.HOME | path join "go" "bin")
)
$env.EDITOR = "nvim"
$env.VISUAL = "nvim"
$env.PAGER = "less"
# config.nu — シェル設定
$env.config = {
show_banner: false
buffer_editor: "nvim"
table: {
mode: rounded
index_mode: auto
trim: {
methodology: wrapping
wrapping_try_keep_words: true
}
}
history: {
file_format: "sqlite"
max_size: 100_000
sync_on_enter: true
isolation: false
}
completions: {
case_sensitive: false
quick: true
partial: true
algorithm: "prefix"
external: {
enable: true
max_results: 100
}
}
}
| コマンド | 説明 |
|---|
module greet { export def hello [] { "hi" } } | モジュールをインラインで定義 |
use greet hello | モジュールからコマンドをインポート |
use greet * | モジュールから全てをインポート |
use utils.nu | ファイルモジュールからインポート |
overlay use spam | オーバーレイを有効化 |
overlay hide spam | オーバーレイを無効化 |
overlay list | アクティブなオーバーレイを一覧表示 |
# ファイル: utils.nu
export def "str kebab" [] {
$in | str downcase | str replace -a " " "-"
}
export def "str title" [] {
$in | split row " "
| each { |w| $w | str capitalize }
| str join " "
}
# 使い方:
# use utils.nu
# "Hello World" | str kebab # "hello-world"
# "hello world" | str title # "Hello World"
| コマンド | 説明 |
|---|
open data.db | SQLiteデータベースを開く |
open data.db | query db "SELECT * FROM users" | SQLクエリを実行 |
open data.db | query db "SELECT * FROM users WHERE age > 30" | フィルタ付きクエリ |
open data.db | schema | データベーススキーマを表示 |
[[name age]; ["Alice" 30]] | into sqlite data.db | テーブルからSQLiteを作成 |
ls | into sqlite -t files data.db | テーブルをSQLiteに保存 |
| コマンド | 説明 |
|---|
plugin list | インストール済みプラグインを一覧表示 |
plugin add /path/to/plugin | プラグインを登録 |
plugin rm plugin_name | プラグインを削除 |
plugin use plugin_name | プラグインを読み込み |
cargo install nu_plugin_formats | formatsプラグインをインストール |
cargo install nu_plugin_query | queryプラグインをインストール |
cargo install nu_plugin_gstat | git statusプラグインをインストール |
-
構造化データを活用する — Nushellは生の文字列ではなく、テーブルとレコードを使って作業する時に真価を発揮します。grepやawkの代わりにselect、where、sort-byでパイプ処理しましょう。
-
関数パラメータに型を付ける — カスタムコマンドに型アノテーション(name: string、count: int)を追加して、エラーを早期に検出し、より良い自動補完を有効にしましょう。
-
不変変数を優先する — デフォルトでletを使い、本当にミューテーションが必要な場合にのみmutを使用しましょう。スクリプト内の意図しない状態変更を防ぎます。
-
SQLite履歴を使用する — $env.config.history.file_format = "sqlite"を設定して、より高速な検索、より良い破損耐性、より豊富なメタデータを得ましょう。
-
パフォーマンスのためにpar-eachを活用する — 多くのアイテムを独立して処理する場合、par-eachは並列スレッドで実行され、eachよりも大幅に高速になります。
-
再利用可能なコードにはモジュールを使用する — カスタムコマンドを.nuモジュールファイルに整理し、sourceではなくuseで読み込みましょう。モジュールは適切な名前空間とエクスポートを持っています。
-
型変換にはintoを使用する — 信頼性の高いスクリプトのために、暗黙的な型強制に頼らず、常に明示的な型変換(into int、into stringなど)を使用しましょう。
-
補完を設定する — 外部補完とcarapaceを有効にして、全てのCLIツールでシェル補完をサポートしましょう。
-
文字列補間を使用する — +による文字列連結よりも$"Hello, ($name)!"を優先して、よりクリーンで読みやすいコードにしましょう。
-
try/catchでエラーを処理する — 失敗する可能性のある操作(ファイルアクセス、HTTP、パース)をtry { } catch { }ブロックで囲んで、堅牢なスクリプトにしましょう。
-
describeでテストする — 開発やデバッグ中にexpression | describeを使って、あらゆる値の型を検査しましょう。
-
クロージャを一貫して使用する — Nushellのクロージャは{ |params| body }構文を使います。明確さのために、単一パラメータでも常にパイプ文字を含めましょう。