# はじめに
こんにちは、Nushellプロジェクトへようこそ。このプロジェクトのゴールは、シンプルなコマンドをパイプでつなぎ合わせるというシェルのUnix哲学を現代の開発スタイルにもちこむことです。
NuはBashのような伝統的なシェル、PowerShellなどの高度なシェル、関数型プログラミング、システムプログラミングなど、多くの分野からヒントを得ています。しかしNuは何でもこなせることを目指すのではなく、いくつかのことをうまくこなせることに注力しています。
- モダンな雰囲気をもつ柔軟なクロスプラットフォームシェルを作ること
- データ構造を理解するコマンドラインアプリケーションを組みあわせることができること
- 現代的なCLIアプリケーションが提供するUXをそなえること
Nuになにができるかをみるには、実際に使ってみることが一番です。
ls
コマンドを実行して最初に気づくことは、テキストブロックではなく、構造化されたテーブルデータが返ってくることです。
> ls
────┬────────────────────┬──────┬────────┬────────────
# │ name │ type │ size │ modified
────┼────────────────────┼──────┼────────┼────────────
0 │ 404.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
─────┼───────┼──────────────────┼─────────┼─────────┼──────────┼─────────
0 │ 33155 │ nu_plugin_core_p │ Running │ 3.8496 │ 1.8 MB │ 4.4 GB
1 │ 32841 │ mdworker_shared │ Running │ 0.0000 │ 19.3 MB │ 4.4 GB
2 │ 32829 │ CoreServicesUIAg │ Running │ 0.0000 │ 16.1 MB │ 4.5 GB
3 │ 32828 │ mdworker_shared │ Running │ 0.0000 │ 23.0 MB │ 4.4 GB
もしあなたがLinuxを利用しているならps
コマンドには馴染みがあるでしょう。これを使うと、現在システムが実行しているすべてのプロセスの状態や名前の一覧を取得することができます。プロセスのCPU負荷も確認することができます。
CPUをアクティブに利用しているプロセスを表示したい場合はどうでしょうか。さきほどのls
コマンドと同じように、ps
コマンドが返すテーブルを利用することができます。
> ps | where cpu > 10
───┬──────┬──────────────────┬─────────┬────────┬──────────┬─────────
# │ pid │ name │ status │ cpu │ mem │ virtual
───┼──────┼──────────────────┼─────────┼────────┼──────────┼─────────
0 │ 3971 │ Google Chrome He │ Running │ 5.1263 │ 99.4 MB │ 5.5 GB
1 │ 360 │ iTerm2 │ Running │ 6.6635 │ 218.6 MB │ 6.0 GB
───┴──────┴──────────────────┴─────────┴────────┴──────────┴─────────
これまで、ls
とps
を利用してファイルやプロセスの一覧を表示しました。Nuはこの他にも便利なテーブルを作り出すコマンドを提供します。次にdate
とsys
をみてみましょう。
date utc
を実行すると、現在の日時と時間に関する情報が得られます。
> date utc
──────────┬──────
year │ 2020
month │ 9
day │ 9
hour │ 9
minute │ 14
second │ 51
timezone │ UTC
──────────┴──────
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
uptime │ 8:03:47:32
sessions │ [table 2 rows]
──────────┴─────────────────────────────────────────────
get
コマンドを利用するとテーブルのカラムの内容を調べることができます。ここでは、Nuが実行されているホストに関する情報を含む"host"列を調べています。OSの名前、ホスト名、CPUなどです。システム上のユーザーの名前を取得してみましょう。
> sys | get host.sessions
───┬─────────
0 │ jonathan
───┴─────────
現在、システムには"jonathan"という名前のユーザが1人だけいます。列の名前だけではなくパスも渡せることに気づくでしょう。Nuはパスを受け取るとテーブルの対応するデータを取得します。
テーブルデータではなく、文字列"jonathan"を取得したことに気づかれたかもしれません。Nuはテーブルだけでなく文字列も扱います。文字列はNu以外のコマンドを扱う上で重要な役割をはたします。
実際にNuの外で文字列がどのように機能するか見てみましょう。先ほどの例で外部のecho
コマンドを実行します。(^
は組込みのecho
コマンドを使用しないよう指示しています)。
> sys | get host.sessions | each { ^echo $it }
jonathan
するどい読者にはこれが以前ものと似ていると思われるでしょう。しかし、さきほどの出力で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 load - Loads the config from the path given
config remove - Removes a value from the config
config path - return the path to the config file
Flags:
-h, --help: Display this help message