更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
shell.h 文件参考

Shell命令开发指导 更多...

浏览源代码.

结构体

struct  ShellCB
 

类型定义

typedef UINT32(* CmdCallBackFunc) (UINT32 argc, const CHAR **argv)
 
typedef CmdCallBackFunc CMD_CBK_FUNC
 
typedef CmdType CMD_TYPE_E
 

枚举

enum  CmdType {
  CMD_TYPE_SHOW = 0 , CMD_TYPE_STD = 1 , CMD_TYPE_EX = 2 , CMD_TYPE_BUTT ,
  CMD_TYPE_SHOW = 0 , CMD_TYPE_STD = 1 , CMD_TYPE_EX = 2 , CMD_TYPE_BUTT
}
 
enum  CmdKeyDirection {
  CMD_KEY_UP = 0 , CMD_KEY_DOWN = 1 , CMD_KEY_RIGHT = 2 , CMD_KEY_LEFT = 4 ,
  CMD_KEY_BUTT , CMD_KEY_UP = 0 , CMD_KEY_DOWN = 1 , CMD_KEY_RIGHT = 2 ,
  CMD_KEY_LEFT = 4 , CMD_KEY_BUTT
}
 

函数

UINT32 osCmdReg (CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)
 以动态方式注册命令 更多...
 

详细描述

Shell命令开发指导

    OpenHarmony内核提供的Shell支持调试常用的基本功能,包含系统、文件、网络和动态加载相关命令。
    同时OpenHarmony内核的Shell支持添加新的命令,可以根据需求来进行定制。

 系统相关命令:提供查询系统任务、内核信号量、系统软件定时器、CPU占用率、当前中断等相关信息的能力。

 文件相关命令:支持基本的ls、cd等功能。

 网络相关命令:支持查询接到开发板的其他设备的IP、查询本机IP、测试网络连接、设置开发板的AP和station模式等相关功能。

 在使用Shell功能的过程中,需要注意以下几点:

    Shell功能支持使用exec命令来运行可执行文件。

    Shell功能支持默认模式下英文输入。如果出现用户在UTF-8格式下输入了中文字符的情况,只能通过回退三次来删除。

    Shell功能支持shell命令、文件名及目录名的Tab键联想补全。若有多个匹配项,则根据共同字符, 打印多个匹配项。
    对于过多的匹配项(打印多于24行),将会进行打印询问(Display all num possibilities?(y/n)),
    用户可输入y选择全部打印,或输入n退出打印,选择全部打印并打印超过24行后,会进行--More--提示,
    此时按回车键继续打印,按q键退出(支持Ctrl+c退出)。

    Shell端工作目录与系统工作目录是分开的,即通过Shell端cd pwd等命令是对Shell端工作目录进行操作,
    通过chdir getcwd等命令是对系统工作目录进行操作,两个工作目录相互之间没有联系。当文件系统操作命令入参是相对路径时要格外注意。

    在使用网络Shell指令前,需要先调用tcpip_init函数完成网络初始化并完成telnet连接后才能起作用,内核默认不初始化tcpip_init。

    不建议使用Shell命令对/dev目录下的设备文件进行操作,这可能会引起不可预知的结果。
 输入Shell命令,有两种输入方式:

    1. 在串口工具中直接输入Shell命令。

    2. 在telnet工具中输入Shell命令(telnet使用方式详见telnet)。
        http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-telnet.html
注意
Shell功能不符合POSIX标准,仅供调试使用。 Shell功能仅供调试使用,在Debug版本中开启(使用时通过menuconfig在配置项中开启"LOSCFG_DEBUG_VERSION"编译开关进行相关控制), 商用产品中禁止包含该功能。
版本
作者
weharmonyos.com | 鸿蒙研究站 | 每天死磕一点点
日期
2021-11-22

在文件 shell.h 中定义.

类型定义说明

◆ CMD_CBK_FUNC

在文件 shell.h171 行定义.

◆ CMD_TYPE_E

在文件 shell.h172 行定义.

◆ CmdCallBackFunc

typedef UINT32(* CmdCallBackFunc) (UINT32 argc, const CHAR **argv)

在文件 shell.h168 行定义.

枚举类型说明

◆ CmdKeyDirection

四个方向上下左右键

枚举值
CMD_KEY_UP 

方向上键

CMD_KEY_DOWN 

方向下键

CMD_KEY_RIGHT 

方向左键

CMD_KEY_LEFT 

方向右键

CMD_KEY_BUTT 
CMD_KEY_UP 
CMD_KEY_DOWN 
CMD_KEY_RIGHT 
CMD_KEY_LEFT 
CMD_KEY_BUTT 

在文件 shell.h156 行定义.

156 {
157 CMD_KEY_UP = 0,
158 CMD_KEY_DOWN = 1,
159 CMD_KEY_RIGHT = 2,
160 CMD_KEY_LEFT = 4,
CmdKeyDirection
Definition: shell.h:95
@ CMD_KEY_BUTT
Definition: shell.h:100
@ CMD_KEY_LEFT
方向右键
Definition: shell.h:99
@ CMD_KEY_DOWN
方向下键
Definition: shell.h:97
@ CMD_KEY_RIGHT
方向左键
Definition: shell.h:98
@ CMD_KEY_UP
方向上键
Definition: shell.h:96

◆ CmdType

enum CmdType

All support cmd types | 所有支持的类型

枚举值
CMD_TYPE_SHOW 

用户怎么输入就怎么显示出现,包括
\0 这些字符也都会存在

CMD_TYPE_STD 

支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。

CMD_TYPE_EX 

不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。

CMD_TYPE_BUTT 
CMD_TYPE_SHOW 

用户怎么输入就怎么显示出现,包括
\0 这些字符也都会存在

CMD_TYPE_STD 

支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。

CMD_TYPE_EX 

不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。

CMD_TYPE_BUTT 

在文件 shell.h149 行定义.

149 {
150 CMD_TYPE_SHOW = 0, ///< 用户怎么输入就怎么显示出现,包括 \n \0 这些字符也都会存在
151 CMD_TYPE_STD = 1, ///< 支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。
152 CMD_TYPE_EX = 2, ///< 不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。
154} CmdType;
CmdType
Definition: shell.h:88
@ CMD_TYPE_BUTT
Definition: shell.h:92
@ CMD_TYPE_STD
支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。
Definition: shell.h:90
@ CMD_TYPE_EX
不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。
Definition: shell.h:91
@ CMD_TYPE_SHOW
用户怎么输入就怎么显示出现,包括 \0 这些字符也都会存在
Definition: shell.h:89

函数说明

◆ osCmdReg()

UINT32 osCmdReg ( CmdType  cmdType,
const CHAR cmdKey,
UINT32  paraNum,
CmdCallBackFunc  cmdProc 
)

以动态方式注册命令

以动态方式注册命令

参数
cmdKey命令关键字,函数在Shell中访问的名称。
cmdProc命令执行函数地址,即命令实际执行函数。
cmdTypeCMD_TYPE_EX:不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉, 例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。 CMD_TYPE_STD:支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。
paraNum调用的执行函数的入参最大个数,暂不支持该参数;当前为默认值XARGS(0xFFFFFFFF)。
注意
命令关键字必须是唯一的,也即两个不同的命令项不能拥有相同的命令关键字,否则只会执行其中一个。 Shell在执行用户命令时,如果存在多个命令关键字相同的命令,只会执行其中在"help"命令中排序在最前面的一个。
返回
参见

在文件 shcmd.c856 行定义.

857{
858 CmdItemNode *cmdItemNode = NULL;
859 //1.确保先拿到锁,魔法数字检查
860 (VOID)LOS_MuxLock(&g_cmdInfo.muxLock, LOS_WAIT_FOREVER);
861 if (g_cmdInfo.initMagicFlag != SHELL_INIT_MAGIC_FLAG) { //验证全局变量的有效性
863 PRINT_ERR("[%s] shell is not yet initialized!\n", __FUNCTION__);
864 return OS_ERRNO_SHELL_NOT_INIT;
865 }
867 //2.参数检查
868 if ((cmdProc == NULL) || (cmdKey == NULL) ||
869 (cmdType >= CMD_TYPE_BUTT) || (strlen(cmdKey) >= CMD_KEY_LEN) || !strlen(cmdKey)) {
870 return OS_ERRNO_SHELL_CMDREG_PARA_ERROR;
871 }
872
873 if (paraNum > CMD_MAX_PARAS) {
874 if (paraNum != XARGS) {
875 return OS_ERRNO_SHELL_CMDREG_PARA_ERROR;
876 }
877 }
878 //3.关键字检查 ;例如:'chmod 777 /home' ,此处检查 'chmod'的合法性
879 if (OsCmdKeyCheck(cmdKey) != TRUE) {
880 return OS_ERRNO_SHELL_CMDREG_CMD_ERROR;
881 }
882 //4.遍历链表节点,验证是否命令存在
883 (VOID)LOS_MuxLock(&g_cmdInfo.muxLock, LOS_WAIT_FOREVER);
884 LOS_DL_LIST_FOR_EACH_ENTRY(cmdItemNode, &(g_cmdInfo.cmdList.list), CmdItemNode, list) {
885 if ((cmdType == cmdItemNode->cmd->cmdType) &&
886 ((strlen(cmdKey) == strlen(cmdItemNode->cmd->cmdKey)) &&
887 (strncmp((CHAR *)(cmdItemNode->cmd->cmdKey), cmdKey, strlen(cmdKey)) == 0))) {
889 return OS_ERRNO_SHELL_CMDREG_CMD_EXIST;//已存在就退出
890 }
891 }
893 //5.正式创建命令,挂入链表
894 return OsCmdItemCreate(cmdType, cmdKey, paraNum, cmdProc);
895}
LITE_OS_SEC_TEXT UINT32 LOS_MuxUnlock(LosMux *mutex)
释放锁
Definition: los_mux.c:559
LITE_OS_SEC_TEXT UINT32 LOS_MuxLock(LosMux *mutex, UINT32 timeout)
拿互斥锁,
Definition: los_mux.c:437
char CHAR
Definition: los_typedef.h:63
LITE_OS_SEC_TEXT_MINOR BOOL OsCmdKeyCheck(const CHAR *cmdKey)
类型变量命名,必须是数字字母下划线,首字母不能是数字
Definition: shcmd.c:505
STATIC UINT32 OsCmdItemCreate(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)
创建一个命令项,例如 chmod
Definition: shcmd.c:809
STATIC CmdModInfo g_cmdInfo
shell 命令模块信息,上面挂了所有的命令项(ls,cd ,cp ==)
Definition: shcmd.c:47
const CHAR * cmdKey
命令关键字,例如:ls 函数在Shell中访问的名称。
Definition: shcmd.h:57
CmdType cmdType
Definition: shcmd.h:54
CmdItem * cmd
命令项
Definition: shcmd.h:64
LOS_DL_LIST list
双向链表
Definition: shcmd.h:63
CmdItemNode cmdList
命令项节点
Definition: shcmd.h:69
UINT32 initMagicFlag
初始魔法标签 0xABABABAB
Definition: shcmd.h:71
LosMux muxLock
操作链表互斥锁
Definition: shcmd.h:72
函数调用图: