命令与组合
命令依次查找内置形式、宏、结构体构造器与成员、命名函数,以及 PATH 中的程序。
外部程序直接启动,表达式不会交给另一个 Shell 解析。
命令名也可以来自文本变量,例如 ($EDITOR file.txt);
变量值作为一个完整的程序名使用,不会隐式拆分出参数。
调用头接受文本命令名、函数值或显式 command 引用;数值、布尔和 nil 即使来自变量也不可调用。需要文本命令名时显式使用 str。int、float、bool 是保留内建命令。
map 用于构造映射;内置操作包括 map/get、map/set、map/del、map/has、map/keys、map/vals 和 map/len,
首参均为映射值,例如 $config 或 {name parsh}。更新操作返回新映射,
使用 set 显式赋回才会更新变量。命令签名与示例见映射。
使用 type 查询命令的解析结果,不会执行被查询的命令:
(type type cd echo)(defn greet (name) (echo hello $name))(type greet)(type -a echo)(let kind (type -t greet))(if (type -t optional-tool) (optional-tool))type 接受多个名称,也支持列表参数,并提供类似 Bash 的选项:
-a:显示所有匹配,包括按 PATH 顺序找到的所有可执行文件路径。-t:对每个匹配输出builtin、macro、struct、function或file。-p:输出外部命令路径;内建形式、宏、结构体和函数不输出内容。-P:强制搜索 PATH,即使存在同名内建命令或函数。-f:跳过函数、宏和结构体查找。
选项可以组合,-- 表示选项结束。不带参数时静默成功。
找不到名称时状态为 1,非法选项的状态为 2。
输出支持捕获和重定向。浏览器终端按宿主提供的命令名称识别外部命令,
-p 和 -P 返回这些名称。
(echo (pwd))(| (find . -name "*.rs") (sort))(|> files.txt (| (find . -name "*.rs") (sort)))(|>> log.txt (echo another entry))(<| input.txt (sort))(|2> errors.txt (grep needle missing.txt))组合操作如下:
|:将外部命令连接为管道。|>、|1>:创建或清空文件,并将标准输出重定向到该文件。|>>、|1>>:创建文件或追加内容,并将标准输出重定向到该文件。<|:从文件读取标准输入。|2>:创建或清空文件,并将标准错误重定向到该文件。|2>>:创建文件或追加内容,并将标准错误重定向到该文件。
重定向始终将路径作为第一个参数、表达式作为第二个参数。 重定向形式可以嵌套,也可以包裹整个管道。 首版管道的每个阶段必须是外部命令调用;函数和改变 Shell 状态的内置形式在管道外执行。
例如,将标准输出写入清空后的日志,并将标准错误追加到另一个日志:
(|1> output.log (|2>> errors.log (make)))顶层命令实时输出。外部命令或管道用作值时,会将标准输出按 UTF-8 捕获, 移除末尾的 LF 换行符,并将结果保持为一个参数。标准错误仍写入原来的目标。 二进制输出应使用管道或文件重定向。显式重定向优先于对该表达式输出的捕获。
完整结果、原始字节捕获、$?、异常和后台执行见执行结果与后台任务。