msh中增加命令
当使用msh模式时,finsh不支持C表达式,因此只能添加(函数)命令,并不能向c-style模式下动态创建变量。msh模式添加命令仅支持下面两种宏方式添加命令。
- #include <finsh.h>
- MSH_CMD_EXPORT(command, desc);
- FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc);
添加内置命令
下面是一种向msh导出命令的方式:
- #include <finsh.h>
- int mycmd(void)
- {
- printf("hello!\n");
- return 0;
- }
- MSH_CMD_EXPORT(mycmd, my command test);
在上面的代码例子中,定义了自己的命令函数 mycmd
,这个函数会在命令行中输出一句
- hello!
当我们想在msh中能够调用这个命令时,就可以使用MSH_CMD_EXPORT
的宏来定义这个函数导出到msh中。把以上的代码加入到系统中,并进行编译,当系统运行起来进入命令行后,我们可以在命令行下输入:
- msh /> mycmd
- hello!
来调用这个mycmd
命令。我们可以看到,这个命令方式和finsh的方式并不一样,在它的后面不需要加入()
括号(类似C代码中调用一个C函数那样),而是直接回车即可执行这个命令。
同样的,在msh下也可以使用参数,例如如下的示例代码:
- #include <finsh.h>
- int mycmdarg(int argc, char** argv)
- {
- printf("argv[0]: %s\n", argv[0]);
- if (argc > 1)
- printf("argv[1]: %s\n", argv[1]);
- return 0;
- }
- MSH_CMD_EXPORT(mycmdarg, my command with args);
当我们在命令行下运行这个命令时,特别是以不同的参数运行时,会发现:
- msh /> mycmdarg
- argv[0]: mycmdarg
- msh /> mycmdarg 0
- argv[0]: mycmdarg
- argv[1]: 0
- msh /> mycmdarg str 1 2 3
- argv[0]: mycmdarg
- argv[1]: str
即,
- argc - 反映的是总计有多少个命令行参数(也包含命令行自身);
- argv - 反映的是命令行参数组,且都是以字符形式存储;
从上的例子可以看出,一个msh导出函数很类似于一个main函数:
- int main(int argc, char** argv);
最初的msh设计确实就是按照主函数方式进行的,所以其命令行参数传递风格也和main函数完全一致。当对命令行参数进行完整的校验时,就可以确保参数的合法性,并对非法的参数提供出相应的错误信息出来。
使用宏导出命令的形式,
- MSH_CMD_EXPORT(cmd, cmd description);
可以导出到msh下。实际上,使用finsh的函数导出宏也可以导出成msh的命令,两者的差别是函数命令在实际存放时,msh的命令名字上会多出_cmd
的前缀。例如以下的finsh导出宏定义也同样的可以在msh中导出对应的命令:
- FINSH_FUNCTION_EXPORT_ALIAS(cmd_ls, __cmd_ls, List information about the FILEs.);
这里面就是把cmdls函数重命名成_cmd_ls导出到shell中。当执行这个命令时,它会被特殊对待,只能当成msh命令使用。实际上,纯粹的finsh shell在显示命令时,对开头的函数名并不显示,会被当成一类特殊的命令对待(例如提供给msh的函数命令)。