nushell - 新しいタイプのシェル

(A new type of shell)

Created at: 2019-05-11 00:59:42
Language: Rust
License: MIT

ヌシェル

Crates.io ビルドステータス 不和 変更履歴#363 @nu_shell GitHub コミットアクティビティ GitHub の貢献者 コデコフ

新しいタイプのシェル。

ヌシェルの例

目次

地位

このプロジェクトは、実行可能な最低限の品質レベルに達しています。多くの人が日常のドライバーとして使用していますが、コマンドによっては不安定になる場合があります。Nuのデザインは、成熟するにつれて変更される可能性があります。

Nuについて学ぶ

Nushell の本は、Nushell のドキュメントの主要な情報源です。Nuコマンドの完全なリストは本にありクックブックにはNuの使用例がたくさんあります。

DiscordやTwitterでも活動しています。是非、私たちとチャットしてください!

取り付け

Nu をすばやくインストールするには:

# Linux and macOS
brew install nushell
# Windows
winget install nushell

GitHub Action で使用するには、setup-nu で詳細を確認してください。

Nu

詳細なインストール手順は、本書のインストールの章にあります。Nuは多くのパッケージマネージャーから入手できます。

梱包状況

哲学

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  │   name    │  cpu  │    mem    │  virtual  │
├───┼───────┼───────────┼───────┼───────────┼───────────┤
│ 0 │  2240 │ Slack.exe │ 16.40 │ 178.3 MiB │ 232.6 MiB │
│ 1 │ 16948 │ Slack.exe │ 16.32 │ 205.0 MiB │ 197.9 MiB │
│ 2 │ 17700 │ nu.exe    │  3.77 │  26.1 MiB │   8.8 MiB │
╰───┴───────┴───────────┴───────┴───────────┴───────────╯

ファイルを開く

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}   │
╰──────────────────┴────────────────────╯

これを、列の 1 つの内容を取得するコマンドにパイプできます。

> 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_*

プラグインは、パスで使用でき、命名規則に従うバイナリです。 これらのバイナリは、単純なJSON-RPCプロトコルを介してnuと対話し、コマンドがそれ自体を識別し、その構成を渡して使用できるようにします。 プラグインがフィルターの場合、データは一度に1つの要素にストリーミングされ、stdin / stdoutを介してデータをストリーミングできます。 プラグインがシンクの場合、最終データの完全なベクトルが与えられ、stdin / stdoutを自由に制御して自由に使用できます。

nu_plugin_*

awesome-nuリポジトリには、さまざまなnuプラグインがリストされています。

目標

Nuは、その設計哲学を構成する一連の目標に厳密に準拠しています。機能が追加されると、これらの目標に対してチェックされます。

  • 何よりもまず、Nuはクロスプラットフォームです。コマンドとテクニックはプラットフォーム間で機能するはずであり、NuはWindows、macOS、およびLinuxのファーストクラスのサポートを備えています。

  • Nu は、既存のプラットフォーム固有の実行可能ファイルとの互換性を保証します。

  • Nuのワークフローとツールは、2022年(およびそれ以降)の最新のソフトウェアに期待される使いやすさを備えている必要があります。

  • Nu は、データを構造化または非構造化のいずれかと見なします。これはPowerShellのような構造化されたシェルです。

  • 最後に、Nu はデータを機能的に表示します。パイプラインは、ミューテーションを使用するのではなく、変更可能な状態なしでデータを読み込んだり、変更したり、保存したりする手段として機能します。

経過

Nuは開発が進んでおり、成熟するにつれて自然に変化します。以下のグラフは網羅的なものではありませんが、開発のいくつかの領域とその相対的な成熟度についてのアイデアを提供するのに役立ちます。

顔立ち 未開始 原型 最優秀選手 プレビュー 熟れる 筆記
エイリアス X エイリアスを使用すると、フラグを渡しながら大きなコマンドを短縮できます
ノートパソコン X 初期のjupyterサポートですが、状態が失われ、機能が不足しています
ファイル操作 X CP、MV、RM、MKDIR にはある程度のサポートがありますが、他のサポートはありません
環境 X 一時的な環境変数とスコープ付き環境変数
シェル X 基本的な値とファイルシェル、ただしコマンドのオプトイン/オプトアウトなし
議定書 X ストリーミングプロトコルはサービス可能です
プラグイン X プラグインは一度に1行ずつ動作し、バッチ処理と式の評価が不足しています
エラー X エラー報告は機能しますが、ユーザビリティポリッシュを使用できます
ドキュメンテーション X 最新リリースに更新された書籍(使用例を含む)
ページング X テキストビューにはページングがありますが、テーブルのページングが必要です
関数 X 関数とエイリアスがサポートされています
変数 X Nuは変数と環境変数をサポートしています
完了 X ファイルパスの入力候補
型チェック x コマンドは、基本タイプと入出力タイプをチェックします

公式後援

このリストに追加する問題またはPRを送信してください。

貢献

詳細については、「貢献」を参照してください。すでに貢献してくれたすべての人々に感謝します!

ライセンス

プロジェクトはMITライセンスの下で利用可能になっています。詳細については、ファイルを参照してください。

LICENSE