クイックツアー
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 KiB │ 3 days ago │
# => │ 3 │ Gemfile.lock │ file │ 6.9 KiB │ 3 days ago │
# => │ 4 │ LICENSE │ file │ 1.1 KiB │ 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 KiB │ 3 days ago │
# => │ 1 │ SUMMARY.md │ file │ 3.7 KiB │ 3 days ago │
# => │ 2 │ Gemfile │ file │ 1.1 KiB │ 3 days ago │
# => │ 3 │ LICENSE │ file │ 1.1 KiB │ 3 days ago │
# => │ 4 │ CONTRIBUTING.md │ file │ 955 B │ 9 mins ago │
# => │ 5 │ books.md │ file │ 687 B │ 3 days ago │
# => ...
これをするのに、 ls
にコマンドライン引数を渡してはいないことが確認できます。代わりに、 Nu が ls
コマンドの出力をソートするために提供している sort-by
コマンドを使用しています。また、最も大きいファイルが一番上に来るように、 reverse
も使用しています。
Nu はテーブルを操作するコマンドを多数提供しています。例えば、 where
を使用して ls
テーブルのコンテンツをフィルターすることができるので、1キロバイトを超えるファイルのみを表示することができます。
ls | where size > 1kb
# => ╭───┬───────────────────┬──────┬─────────┬────────────╮
# => │ # │ name │ type │ size │ modified │
# => ├───┼───────────────────┼──────┼─────────┼────────────┤
# => │ 0 │ Gemfile │ file │ 1.1 KiB │ 3 days ago │
# => │ 1 │ Gemfile.lock │ file │ 6.9 KiB │ 3 days ago │
# => │ 2 │ LICENSE │ file │ 1.1 KiB │ 3 days ago │
# => │ 3 │ SUMMARY.md │ file │ 3.7 KiB │ 3 days ago │
# => ╰───┴───────────────────┴──────┴─────────┴────────────╯
Unix の哲学と同様、互いに対話可能なコマンドにより、さまざまな異なる組み合わせの使用が可能になります。では、別のコマンドを見てみましょう。
ps
# => ╭─────┬───────┬───────┬──────────────────────────────────────────────┬─────────┬───────┬──────────┬──────────╮
# => │ # │ pid │ ppid │ name │ status │ cpu │ mem │ virtual │
# => ├─────┼───────┼───────┼──────────────────────────────────────────────┼─────────┼───────┼──────────┼──────────┤
# => │ 0 │ 87194 │ 1 │ mdworker_shared │ Sleep │ 0.00 │ 25.9 MB │ 418.0 GB │
# => │ 1 │ 87183 │ 2314 │ Arc Helper (Renderer) │ Sleep │ 0.00 │ 59.9 MB │ 1.6 TB │
# => │ 2 │ 87182 │ 2314 │ Arc Helper (Renderer) │ Sleep │ 0.23 │ 224.3 MB │ 1.6 TB │
# => │ 3 │ 87156 │ 87105 │ Code Helper (Plugin) │ Sleep │ 0.00 │ 56.0 MB │ 457.4 GB │
# => ...
もし Linux を使用したことがあるなら、 ps
コマンドは馴染みがあるでしょう。これを使用して、システム上で現在実行されている全てのプロセスのリストと、それらのステータス、名前を取得することができます。プロセスのCPU使用率を見ることもできます。
いま表示したいのは、CPUをたくさん使用しているプロセスですか? ls
コマンドで以前したのと同じように、 ps
コマンドが返したテーブルに対しても操作することができます。
ps | where cpu > 5
# => ╭───┬───────┬───────┬─────────────────────────────────────────┬─────────┬───────┬──────────┬──────────╮
# => │ # │ pid │ ppid │ name │ status │ cpu │ mem │ virtual │
# => ├───┼───────┼───────┼─────────────────────────────────────────┼─────────┼───────┼──────────┼──────────┤
# => │ 0 │ 86759 │ 86275 │ nu │ Running │ 6.27 │ 38.7 MB │ 419.7 GB │
# => │ 1 │ 89134 │ 1 │ com.apple.Virtualization.VirtualMachine │ Running │ 23.92 │ 1.5 GB │ 427.3 GB │
# => │ 2 │ 70414 │ 1 │ VTDecoderXPCService │ Sleep │ 19.04 │ 17.5 MB │ 419.7 GB │
# => │ 3 │ 2334 │ 1 │ TrackpadExtension │ Sleep │ 7.47 │ 25.3 MB │ 418.8 GB │
# => │ 4 │ 1205 │ 1 │ iTerm2 │ Sleep │ 11.92 │ 657.2 MB │ 421.7 GB │
# => ╰───┴───────┴───────┴─────────────────────────────────────────┴─────────┴───────┴──────────┴──────────╯
いま、ls
と ps
を使用してファイルとプロセスのリストを表示しました。Nu はほかにも有用な情報をもつテーブルを作成するコマンドを提供しています。次は、 date
と sys
について見てみましょう。
date now
を実行すると、現在の日時に関する情報が得られます。
date now
# => 2022-03-07 14:14:51.684619600 -08:00
テーブルとして取得したい場合は、これを date to-table
に渡します。
date now | date to-table
# => ╭───┬──────┬───────┬─────┬──────┬────────┬────────┬──────────╮
# => │ # │ year │ month │ day │ hour │ minute │ second │ timezone │
# => ├───┼──────┼───────┼─────┼──────┼────────┼────────┼──────────┤
# => │ 0 │ 2022 │ 3 │ 7 │ 14 │ 45 │ 3 │ -08:00 │
# => ╰───┴──────┴───────┴─────┴──────┴────────┴────────┴──────────╯
sys
を実行すると、 Nu が実行されているシステムに関する情報が得られます。
sys
# => ╭───────┬───────────────────╮
# => │ host │ {record 6 fields} │
# => │ cpu │ [table 4 rows] │
# => │ disks │ [table 3 rows] │
# => │ mem │ {record 4 fields} │
# => │ temp │ [table 1 row] │
# => │ net │ [table 4 rows] │
# => ╰───────┴───────────────────╯
これはいままでに見たテーブルと少し異なります。 sys
コマンドは、単純な値の代わりに構造化されたテーブルをセルに持つテーブルを返します。このデータを覗くには、カラムを get する必要があります。
sys | get host
# => ╭────────────────┬────────────────────────╮
# => │ name │ Debian GNU/Linux │
# => │ os version │ 11 │
# => │ kernel version │ 5.10.92-v8+ │
# => │ hostname │ lifeless │
# => │ uptime │ 19day 21hr 34min 45sec │
# => │ sessions │ [table 1 row] │
# => ╰────────────────┴────────────────────────╯
get
コマンドを使用すると、テーブルのカラムの内容にジャンプすることができます。この例では、 Nu が実行されているホストに関する情報が含まれる "host" カラムを見ています。OSの名前、ホスト名、CPUなどです。では、システム上に存在するユーザーの名前を取得してみましょう。
sys | get host.sessions.name
# => ╭───┬──────────╮
# => │ 0 │ sophiajt │
# => ╰───┴──────────╯
いま、システムには "sophiajt" という名前のユーザー一人だけがいます。ここで、ただのカラム名ではなく、カラムのパス( host.sessions.name
の部分)を渡していることに気づくでしょう。Nu はカラムのパスを受け取って、テーブル中の対応する部分に移動します。
もう一つ違いがあることに気づいたかもしれません。データのテーブルではなく、文字列 "sophiajt" という、ただ一つの要素を受け取っています。Nu はデータのテーブルでも、文字列でも動作します。文字列は Nu の外部コマンドで作業する際の重要な役割を担います。
実際に Nu の外部での文字列の働きを見てみましょう。先程の例にならい、echo
コマンド( ^
は Nu に、ビルトインの echo
コマンドを使用しないことを伝えます)を実行してみます
sys | get host.sessions.name | each { |elt| ^echo $elt }
# => sophiajt
これが前に試したものとよく似ているように見えるなら鋭いです!これは似ていますが、一つ重要な違いがあります。先程の値で ^echo
を呼び出しました。これで、データをNu から echo
(あるいは git
のような、あらゆる Nu の外部のコマンド)に渡すことができるのです。
ヘルプの取得
Nu のビルトインコマンド全てのヘルプテキストは、 help
で見つけることができます。すべてのコマンドを見たい場合は、 help commands
を実行してください。また、 help -f <topic>
を実行すれば、あるトピックについて検索することもできます。
help path
# => Explore and manipulate paths.
# =>
# => There are three ways to represent a path:
# =>
# => * As a path literal, e.g., '/home/viking/spam.txt'
# => * As a structured path: a table with 'parent', 'stem', and 'extension' (and
# => * 'prefix' on Windows) columns. This format is produced by the 'path parse'
# => subcommand.
# => * As an inner list of path parts, e.g., '[[ / home viking spam.txt ]]'.
# => Splitting into parts is done by the `path split` command.
# =>
# => All subcommands accept all three variants as an input. Furthermore, the 'path
# => join' subcommand can be used to join the structured path or path parts back into
# => the path literal.
# =>
# => Usage:
# => > path
# =>
# => Subcommands:
# => path basename - Get the final component of a path
# => path dirname - Get the parent directory of a path
# => path exists - Check whether a path exists
# => path expand - Try to expand a path to its absolute form
# => path join - Join a structured path or a list of path parts.
# => path parse - Convert a path into structured data.
# => path relative-to - Get a path as relative to another path.
# => path split - Split a path into parts by a separator.
# => path type - Get the type of the object a path refers to (e.g., file, dir, symlink)
# =>
# => Flags:
# => -h, --help
# => Display this help message