新しいタイプのシェル。

このプロジェクトは、実用最小限の製品(MVP)レベルの品質に達しています。多くの人が日常的に使用していますが、一部のコマンドでは不安定な場合があります。Nu の設計は成熟するにつれて変更される可能性があります。
Nushell book は、Nushell のドキュメントの主要な情報源です。本の中で Nu コマンドの完全なリストを確認でき、cookbook には Nu の使用例が多数掲載されています。
また、Discord でも活動しています。ぜひチャットに参加してください!
Nu を素早くインストールするには:
# Linux and macOS
brew install nushell
# Windows
winget install nushell
GitHub Action で Nu を使用するには、詳細について setup-nu を確認してください。
詳細なインストール手順は、本のインストールの章に記載されています。Nu は多くのパッケージマネージャーから入手できます:
Nushell チームが積極的にサポートしているプラットフォームの詳細については、プラットフォームサポートポリシーを参照してください。
デフォルトの設定は sample_config にあり、これは初めて Nushell を起動したときに取得される設定ファイルです。
これは Nushell を実行するためのすべてのデフォルト設定を設定します。ここから、このファイルを特定のニーズに合わせてカスタマイズできます。
システム上で config.nu がどこにあるかを確認するには、このコマンドを入力するだけです。
$nu.config-path
Nushell のドキュメントのすべてについては、本を参照してください。
Nu は PowerShell、関数型プログラミング言語、モダンな CLI ツールなどのプロジェクトからインスピレーションを得ています。 ファイルやデータを生のテキストストリームとして考えるのではなく、Nu は各入力を構造を持つものとして扱います。 たとえば、ディレクトリの内容を一覧表示すると、返ってくるのは行のテーブルで、各行はそのディレクトリ内の項目を表します。 これらの値は、「パイプライン」と呼ばれる一連のコマンドを通じて、一連のステップを経てパイプ処理できます。
Unix では、洗練されたコマンドを複数のステップに分割するために、コマンド間でパイプすることが一般的です。 Nu はこれをさらに一歩進め、パイプライン のアイデアに大きく基づいて構築されています。 Unix の哲学と同様に、Nu ではコマンドが stdout に出力し、stdin から読み取ることができます。 さらに、コマンドは構造化データを出力できます(これは第3の種類のストリームと考えることができます)。 パイプラインで機能するコマンドは、次の3つのカテゴリのいずれかに分類されます:
ls)where type == "dir")table)コマンドはパイプ記号(|)で区切られ、左から右へ流れるパイプラインを示します。
ls | where type == "dir" | table
# => ╭────┬──────────┬──────┬─────────┬───────────────╮
# => │ # │ name │ type │ size │ modified │
# => ├────┼──────────┼──────┼─────────┼───────────────┤
# => │ 0 │ .cargo │ dir │ 0 B │ 9 minutes ago │
# => │ 1 │ assets │ dir │ 0 B │ 2 weeks ago │
# => │ 2 │ crates │ dir │ 4.0 KiB │ 2 weeks ago │
# => │ 3 │ docker │ dir │ 0 B │ 2 weeks ago │
# => │ 4 │ docs │ dir │ 0 B │ 2 weeks ago │
# => │ 5 │ images │ dir │ 0 B │ 2 weeks ago │
# => │ 6 │ pkg_mgrs │ dir │ 0 B │ 2 weeks ago │
# => │ 7 │ samples │ dir │ 0 B │ 2 weeks ago │
# => │ 8 │ src │ dir │ 4.0 KiB │ 2 weeks ago │
# => │ 9 │ target │ dir │ 0 B │ a day ago │
# => │ 10 │ tests │ dir │ 4.0 KiB │ 2 weeks ago │
# => │ 11 │ wix │ dir │ 0 B │ 2 weeks ago │
# => ╰────┴──────────┴──────┴─────────┴───────────────╯
ほとんどの場合、パイプラインの出力を確認したいので、table が想定されています。
上記は次のように書くこともできます:
ls | where type == "dir"
同じコマンドを使用して異なる方法で組み合わせることができることは、Nu の重要な哲学です。
たとえば、組み込みの ps コマンドを使用して実行中のプロセスのリストを取得し、上記と同じ where を使用できます。
ps | where cpu > 0
# => ╭───┬───────┬──────┬───────────┬──────┬─────────┬───────┬────────────┬──────────╮
# => │ # │ pid │ ppid │ name │ user │ status │ cpu │ cpu_time │ mem │
# => ├───┼───────┼──────┼───────────┼──────┼─────────┼───────┼────────────┼──────────┤
# => │ 0 │ 2240 │ 9872 │ Slack.exe │ dev │ Running │ 16.40 │ 1min 12sec │ 178.3 MB │
# => │ 1 │ 16948 │ 9872 │ Slack.exe │ dev │ Running │ 16.32 │ 48sec │ 205.0 MB │
# => │ 2 │ 17700 │ 4632 │ nu.exe │ dev │ Running │ 3.77 │ 2sec │ 26.1 MB │
# => ╰───┴───────┴──────┴───────────┴──────┴─────────┴───────┴────────────┴──────────╯
Nu は、ファイルや URL の内容を生のテキストまたは構造化データ(形式を認識した場合)として読み込むことができます。 たとえば、.toml ファイルを構造化データとして読み込み、探索できます:
open Cargo.toml
# => ╭──────────────────┬────────────────────╮
# => │ bin │ [table 1 row] │
# => │ dependencies │ {record 25 fields} │
# => │ dev-dependencies │ {record 8 fields} │
# => │ features │ {record 10 fields} │
# => │ package │ {record 13 fields} │
# => │ patch │ {record 1 field} │
# => │ profile │ {record 3 fields} │
# => │ target │ {record 3 fields} │
# => │ workspace │ {record 1 field} │
# => ╰──────────────────┴────────────────────╯
これを、いずれかの列の内容を取得するコマンドにパイプできます:
open Cargo.toml | get package
# => ╭───────────────┬────────────────────────────────────╮
# => │ authors │ [list 1 item] │
# => │ default-run │ nu │
# => │ description │ A new type of shell │
# => │ documentation │ https://www.nushell.sh/book/ │
# => │ edition │ 2018 │
# => │ exclude │ [list 1 item] │
# => │ homepage │ https://www.nushell.sh │
# => │ license │ MIT │
# => │ metadata │ {record 1 field} │
# => │ name │ nu │
# => │ repository │ https://github.com/nushell/nushell │
# => │ rust-version │ 1.60 │
# => │ version │ 0.72.0 │
# => ╰───────────────┴────────────────────────────────────╯
必要に応じて、さらに深く掘り下げることができます:
open Cargo.toml | get package.version
# => 0.72.0
Nu は、シェルに追加機能を提供し、組み込みコマンドが使用するのと同じ構造化データモデルに従うプラグインをサポートしています。crates/nu_plugins_* ディレクトリにいくつかの例があります。
プラグインは、パス内で利用可能なバイナリであり、nu_plugin_* という命名規則に従います。
これらのバイナリは、コマンドが自身を識別し、その設定を渡すシンプルな JSON-RPC プロトコルを介して nu とやり取りし、使用可能にします。
プラグインがフィルタの場合、データは一度に1つの要素としてそれにストリームされ、stdin/stdout を介してデータをストリームバックできます。
プラグインがシンクの場合、最終データの完全なベクトルが与えられ、stdin/stdout を自由に使用できます。
awesome-nu リポジトリにはさまざまな nu-plugins がリストされており、showcase リポジトリでは、Nushell について書かれた有益なブログ記事や、発表された技術トピックを強調するビデオが紹介されています。
Nu は、その設計哲学を構成する一連の目標に厳密に従っています。機能が追加されると、これらの目標に対してチェックされます。
何よりもまず、Nu はクロスプラットフォームです。コマンドとテクニックはプラットフォーム間で機能する必要があり、Nu は Windows、macOS、Linux をファーストクラスでサポートしています。
Nu は、既存のプラットフォーム固有の実行可能ファイルとの互換性を保証します。