命令
命令是 Nu 中管道的构建块。它们执行管道的操作,无论是创建数据、在数据从输入流向输出时更改数据,还是在数据退出管道后查看数据。有两种类型的命令:内部命令,即构建在 Nu 内部运行的命令;以及外部命令,即位于 Nu 外部并通过标准 Unix 风格的 stdin
/stdout
进行通信的命令。
内部命令
Nu 内部的所有命令,包括插件,都是内部命令。内部命令使用 PipelineData
相互通信。
签名
命令使用轻量级类型检查来确保传递给它们的参数能够正确处理。为了实现这一点,每个 Command
都提供一个 Signature
,它告诉 Nu:
- 命令的名称
- 位置参数(例如在
start x y
中,x
和y
是位置参数) - 命令是否接受无限数量的额外位置参数(例如
start a1 a2 a3 ... a99 a100
) - 命名参数(例如
ansi gradient --fgstart '0x40c9ff'
)
有了这些信息,可以在执行之前检查管道是否存在潜在问题。
外部命令
外部命令是不属于 Nu 内置命令或插件的任何命令。如果调用了一个 Nu 不知道的命令,它将使用提供的参数调用底层环境,尝试将此命令作为外部程序调用。
内部和外部命令之间的通信
内部到内部
内部命令使用 Nu 提供的完整值流相互通信,其中包括所有内置文件类型。这包括内部命令和插件之间的通信(双向)。
内部到外部
向外部命令发送文本的内部命令需要提前准备好文本字符串。如果直接将对象发送到外部命令,这将被视为错误,因为无法推断结构化数据应如何为外部命令表示。期望用户要么缩小到简单的数据单元格,要么使用文件类型转换器之一(如 to json
)将表格转换为字符串表示形式。
外部命令被打开,以便重定向其 stdin
,从而可以将数据发送给它。
外部到内部
外部命令通过其 stdout
发送一系列字符串。这些字符串被读入管道,并可供管道中的下一个内部命令使用,或者如果外部命令是管道的最后一步,则显示给用户。
外部到外部
外部命令通过 stdin
/stdout
相互通信。由于 Nu 会检测到这种情况,它将把第一个命令的 stdout
重定向到后续外部命令的 stdin
。通过这种方式,保持了外部命令之间 shell 管道的预期行为。