Shell 系统使用指南
本页依据 文档基线与后续更新 中记录的 Zephyr main 快照更新。
Shell 提供命令树、参数检查、帮助、补全和交互后端。
命令处理接口位于 <zephyr/shell/shell.h>。
启用 CONFIG_SHELL=y 后,还应配置对应传输后端与硬件。
命令函数与参数数量
命令处理函数接收 Shell 实例、参数个数和字符串数组,返回状态码。 参数数量包含命令自身名称。下面注册一个必须携带一个数值参数的根命令:
#include <zephyr/shell/shell.h>
#include <errno.h>
#include <stdlib.h>
static int cmd_value(const struct shell *sh, size_t argc, char **argv)
{
char *end;
long value;
ARG_UNUSED(argc);
errno = 0;
value = strtol(argv[1], &end, 10);
if (errno != 0 || end == argv[1] || *end != '\0' ||
value < 0 || value > 1000) {
shell_error(sh, "value must be an integer from 0 to 1000");
return -EINVAL;
}
shell_print(sh, "value=%ld", value);
return 0;
}
SHELL_CMD_ARG_REGISTER(value, NULL, "Print a value: value <0..1000>",
cmd_value, 2, 0);
2, 0 表示两个必需参数(命令名和值),没有可选参数。
即使 Shell 做了数量检查,处理函数仍要验证数值范围与字符串解析结果。
Shell 命令回调中的 argv 由 Shell 管理,不能在回调返回后由异步工作继续引用。
需要异步处理时先复制必要数据,再交给工作队列或消息队列。
静态子命令
static int cmd_ping(const struct shell *sh, size_t argc, char **argv)
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
shell_print(sh, "pong");
return 0;
}
SHELL_STATIC_SUBCMD_SET_CREATE(demo_commands,
SHELL_CMD_ARG(ping, NULL, "Ping", cmd_ping, 1, 0),
SHELL_SUBCMD_SET_END
);
SHELL_CMD_REGISTER(demo, &demo_commands, "Demo commands", NULL);
输入 demo ping 调用子命令。子命令回调的 argv[0] 是当前处理的子命令名称,
不能固定按整条原始输入的索引解析。根命令名称必须唯一。
动态命令
SHELL_DYNAMIC_CMD_CREATE() 通过回调逐项枚举当前命令集,适合运行时发现的设备或对象。
回调签名是 void get(size_t idx, struct shell_static_entry *entry)。
枚举结束时设置 entry->syntax = NULL;有效条目应完整设置 syntax、help、subcmd 和 handler。
动态名称存储必须在 Shell 使用期间有效。不能返回临时栈上的字符串; 更新动态列表应考虑与帮助/补全同时访问的同步问题,并按官方示例维护适合补全的排序。 如果动态条目使用参数检查字段,也需要完整初始化它们,不能只更新名称而保留旧字段。
后端
UART:需
CONFIG_SHELL_BACKEND_SERIAL与正确的控制台/串口设备。RTT:需相应 RTT 配置和调试探针,可按支持的 runner 使用
west rtt。USB CDC ACM:上游提供
cdc-acm-consolesnippet,可用于支持 USB 的开发板。其他后端:包括 Telnet、MQTT、BLE NUS、RPMSG 等,依赖各自传输与配置。
例如在支持 USB 的目标上,构建时加入 -S cdc-acm-console:
west build -p always -b <board-target> -S cdc-acm-console samples/subsys/shell/shell_module
<board-target> 需替换。片段解决的是相关配置组合,仍需检查板卡的 USB 支持与连接端口。
多个 Shell 实例可共存,处理函数应使用传入的 sh 输出,不要假设唯一 UART 实例。
交互、内置命令和日志
帮助使用 help、-h 或 --help。Tab 补全、历史、通配符、MetaKey、颜色和命令行
编辑均有相应配置;默认值由目标配置决定。CONFIG_SHELL_MINIMAL 可减少功能与占用,
但应核对实际保留了哪些交互能力。
启用对应 Shell 日志后端/命令配置,可把日志与交互界面协调输出。 在 Shell 正在编辑输入时,直接对同一串口输出大量 printk 可能破坏显示, 应优先使用 Shell 或日志提供的输出路径。
命令运行在线程上下文,但长时间阻塞会降低交互响应。需要硬件操作时, 命令先检查参数、明确目标和当前状态,再把耗时操作交给专用线程,并返回适当结果。