# はじめに

こんにちは、Nushellプロジェクトへようこそ。このプロジェクトのゴールは、シンプルなコマンドをパイプでつなぎ合わせるというシェルのUnix哲学を現代の開発スタイルにもちこむことです。

NuはBashのような伝統的なシェル、PowerShellなどの高度なシェル、関数型プログラミング、システムプログラミングなど、多くの分野からヒントを得ています。しかしNuは何でもこなせることを目指すのではなく、いくつかのことをうまくこなせることに注力しています。

  • モダンな雰囲気をもつ柔軟なクロスプラットフォームシェルを作ること
  • データ構造を理解するコマンドラインアプリケーションを組みあわせることができること
  • 現代的なCLIアプリケーションが提供するUXをそなえること

Nuになにができるかをみるには、実際に使ってみることが一番です。

lsコマンドを実行して最初に気づくことは、テキストブロックではなく、構造化されたテーブルデータが返ってくることです。

> ls
────┬────────────────────┬──────┬────────┬────────────
 #  │ name               │ type │ size   │ modified
────┼────────────────────┼──────┼────────┼────────────
  0404.html           │ File │  429 B │ 3 days ago
  1 │ CONTRIBUTING.md    │ File │  955 B │ 8 mins ago
  2 │ Gemfile            │ File │ 1.1 KB │ 3 days ago
  3 │ Gemfile.lock       │ File │ 6.9 KB │ 3 days ago
  4 │ LICENSE            │ File │ 1.1 KB │ 3 days ago
  5 │ README.md          │ File │  213 B │ 3 days ago
...

このテーブルはディレクトリの内容を別の方法で表示しているだけではありません。このテーブルを利用するとスプレッドシートと同じように、よりインタラクティブにデータを操作できます。

最初に行うことはテーブルをサイズでソートすることです。これを行うにはlsの出力を取得して、カラムの内容に基づいてテーブルをソートするコマンドに入力します。

> ls | sort-by size | reverse
────┬────────────────────┬──────┬────────┬────────────
 #  │ name               │ type │ size   │ modified
────┼────────────────────┼──────┼────────┼────────────
  0 │ Gemfile.lock       │ File │ 6.9 KB │ 3 days ago
  1 │ SUMMARY.md         │ File │ 3.7 KB │ 3 days ago
  2 │ Gemfile            │ File │ 1.1 KB │ 3 days ago
  3 │ LICENSE            │ File │ 1.1 KB │ 3 days ago
  4 │ CONTRIBUTING.md    │ File │  955 B │ 9 mins ago
  5 │ books.md           │ File │  687 B │ 3 days ago
...

この作業をおこなうために、lsにコマンドライン引数を渡していないことがわかります。代わりに、Nuが提供するsort-byコマンドを利用して、lsコマンドの出力をソートしています。また、一番大きなファイルを表示するために逆順に並び替えています。

Nuにはテーブルを扱うための多くのコマンドが用意されています。例えば、1キロバイトを超えるファイルのみを表示するようにlsコマンドの出力をフィルターできます。

> ls | where size > 1kb
───┬──────────────┬──────┬────────┬────────────
 # │ name         │ type │ size   │ modified
───┼──────────────┼──────┼────────┼────────────
 0 │ Gemfile      │ File │ 1.1 KB │ 3 days ago
 1 │ Gemfile.lock │ File │ 6.9 KB │ 3 days ago
 2 │ LICENSE      │ File │ 1.1 KB │ 3 days ago
 3 │ SUMMARY.md   │ File │ 3.7 KB │ 3 days ago
───┴──────────────┴──────┴────────┴────────────

Unix哲学にあるように、コマンドをつなぎ合わせることで様々な組み合わせを作り出すことができます。別のコマンドをみてみましょう。

> ps
─────┬───────┬──────────────────┬─────────┬─────────┬──────────┬─────────
 #   │ pid   │ name             │ status  │ cpu     │ mem      │ virtual
─────┼───────┼──────────────────┼─────────┼─────────┼──────────┼─────────
   033155 │ nu_plugin_core_p │ Running │  3.84961.8 MB │  4.4 GB
   132841 │ mdworker_shared  │ Running │  0.000019.3 MB │  4.4 GB
   232829 │ CoreServicesUIAg │ Running │  0.000016.1 MB │  4.5 GB
   332828 │ mdworker_shared  │ Running │  0.000023.0 MB │  4.4 GB

もしあなたがLinuxを利用しているならpsコマンドには馴染みがあるでしょう。これを使うと、現在システムが実行しているすべてのプロセスの状態や名前の一覧を取得することができます。プロセスのCPU負荷も確認することができます。

CPUをアクティブに利用しているプロセスを表示したい場合はどうでしょうか。さきほどのlsコマンドと同じように、psコマンドが返すテーブルを利用することができます。

> ps | where cpu > 5
───┬──────┬──────────────────┬─────────┬────────┬──────────┬─────────
 # │ pid  │ name             │ status  │ cpu    │ mem      │ virtual
───┼──────┼──────────────────┼─────────┼────────┼──────────┼─────────
 03971 │ Google Chrome He │ Running │ 5.126399.4 MB │  5.5 GB
 1360 │ iTerm2           │ Running │ 6.6635218.6 MB │  6.0 GB
───┴──────┴──────────────────┴─────────┴────────┴──────────┴─────────

これまで、lspsを利用してファイルやプロセスの一覧を表示しました。Nuはこの他にも便利なテーブルを作り出すコマンドを提供します。次にdatesysをみてみましょう。

date nowを実行すると、現在の日時と時間に関する情報が得られます。

> date now
2020-09-09 09:14:51.684619600 +00:00

sysはNuが実行されているシステムに関する情報を提供します。

> sys
─────────┬─────────────────────────────────────────
 host[row 7 columns]
 cpu     │ [row cores current ghz max ghz min ghz]
 disks   │ [table 2 rows]
 mem     │ [row free swap free swap total total]
 net     │ [table 11 rows]
 battery │ [table 1 rows]
─────────┴─────────────────────────────────────────

これはさきほどまでのテーブルと少し異なります。sysコマンドは単純な値ではなくセルに構造化されたテーブルを含むテーブルを提供します。このデータを見るには表示する列を選択する必要があります。

> sys | get host
──────────┬─────────────────────────────────────────────
 name     │ Linux
 release  │ 5.3.0-1019-azure
 version  │ #20-Ubuntu SMP Fri Mar 27 23:54:23 UTC 2020
 hostname │ lifeless
 arch     │ x86_64
 uptime8:03:47:32
 sessions │ [table 2 rows]
──────────┴─────────────────────────────────────────────

getコマンドを利用するとテーブルのカラムの内容を調べることができます。ここでは、Nuが実行されているホストに関する情報を含む"host"列を調べています。OSの名前、ホスト名、CPUなどです。システム上のユーザーの名前を取得してみましょう。

> sys | get host.sessions.name
───┬────
 0 │ jt
───┴────

現在、システムには"jonathan"という名前のユーザが1人だけいます。列の名前だけではなくパスも渡せることに気づくでしょう。Nuはパスを受け取るとテーブルの対応するデータを取得します。

テーブルデータではなく、文字列"jonathan"を取得したことに気づかれたかもしれません。Nuはテーブルだけでなく文字列も扱います。文字列はNu以外のコマンドを扱う上で重要な役割をはたします。

実際にNuの外で文字列がどのように機能するか見てみましょう。先ほどの例で外部のechoコマンドを実行します。(^は組込みのechoコマンドを使用しないよう指示しています)。

> sys | get host.sessions.name | each { ^echo $it }
jt

するどい読者にはこれが以前ものと似ていると思われるでしょう。しかし、さきほどの出力でechoを呼び出しているという重要な違いがあります。このように、Nuからデータをecho(またはgitのようなNu以外の任意のコマンド)にわたすことができるのです。

注:Nuの組み込みコマンドのヘルプテキストは、helpコマンドで検出できます。

> help config
Configuration management.

Usage:
  > config <subcommand> {flags}

Subcommands:
  config get - Gets a value from the config
  config set - Sets a value in the config
  config set_into - Sets a value in the config
  config clear - clear the config
  config remove - Removes a value from the config
  config path - return the path to the config file

Flags:
  -h, --help: Display this help message