パイプライン

Nuのコアデザインのひとつがパイプラインです。パイプラインはUnixの背後にある哲学にまでそのルーツを遡ることができるデザインアイデアです。Nuは、Unixの文字列データを拡張したように、パイプラインの概念も拡張してテキスト以外のものも扱えるようにします。

基礎

パイプラインは、入力、フィルター、出力の3つの部分から構成されます。

> open "Cargo.toml" | inc package.version | save "Cargo_new.toml"

最初のコマンドopen "Cargo.toml"が入力です(しばしば"source"や"producer"と呼ばれます)。これによりデータが作成またはロードされパイプラインに送られます。パイプラインは入力から渡された値を扱います。lsのようなコマンドも入力です。ファイルシステムからデータを取得し、パイプラインを経由して扱えるようにするからです。

2番目のコマンドinc package.versionはフィルターです。フィルターは与えられたデータをうけとると大抵の場合はなにかします。それは変更(incコマンドの例のように)であったり、ロギングなどの別の操作かもしれません。

最後のコマンドsave "Cargo_new.toml"が出力です("sink"と呼ばれることもあります)。出力はパイプラインから入力を受け取り、最終的な操作を実行します。この例では、最終ステップとして、パイプラインを介しておくられてきたものをファイルに保存しています。他の出力コマンドとしては、値をうけとりユーザのために表示するものがあります。

外部コマンドの使用

Nuのコマンドは互いにNuのデータ型(types of dataを参照してください)を利用してやりとりします。しかし、Nu以外のコマンドはどうでしょうか。外部コマンドの使用例をみてみましょう。

internal_command | external_command

データは内部コマンドから外部コマンドにむかって流れます。このデータは文字列であることが期待されるので、外部コマンドのstdinに送られます。

external_command | internal_command

外部コマンドからNuに送られるデータは単一の文字列にまとめられ、内部コマンドに渡されます。linesのようなコマンドは外部からのデータを取り込む際に便利です。

external_command_1 | external_command_2

NuはBashのような他のシェルと同じように2つの外部コマンドでパイプされるデータを処理します。外部コマンド1のstdoutは外部コマンド2のstdinにつながれます。これにより2つのコマンドの間でデータは自然にやりとりされます。

内部の仕組み

lsが出力ではなく入力の場合、テーブルがどのように表示されるのか疑問に思われるかもしれません。Nuはautoviewとよばれるコマンドを自動的に出力に加えます。autoviewコマンドは結果を確認できる出力をもたないパイプラインに追加されるのです。

実質的にこのコマンドと

> ls

このパイプラインは

> ls | autoview

おなじものです。