msh中增加命令

当使用msh模式时,finsh不支持C表达式,因此只能添加(函数)命令,并不能向c-style模式下动态创建变量。msh模式添加命令仅支持下面两种宏方式添加命令。

  1. #include <finsh.h>
  2. MSH_CMD_EXPORT(command, desc);
  3. FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc);

添加内置命令

下面是一种向msh导出命令的方式:

  1. #include <finsh.h>
  2.  
  3. int mycmd(void)
  4. {
  5. printf("hello!\n");
  6. return 0;
  7. }
  8. MSH_CMD_EXPORT(mycmd, my command test);

在上面的代码例子中,定义了自己的命令函数 mycmd ,这个函数会在命令行中输出一句

  1. hello!

当我们想在msh中能够调用这个命令时,就可以使用MSH_CMD_EXPORT的宏来定义这个函数导出到msh中。把以上的代码加入到系统中,并进行编译,当系统运行起来进入命令行后,我们可以在命令行下输入:

  1. msh /> mycmd
  2. hello!

来调用这个mycmd命令。我们可以看到,这个命令方式和finsh的方式并不一样,在它的后面不需要加入()括号(类似C代码中调用一个C函数那样),而是直接回车即可执行这个命令。

同样的,在msh下也可以使用参数,例如如下的示例代码:

  1. #include <finsh.h>
  2.  
  3. int mycmdarg(int argc, char** argv)
  4. {
  5. printf("argv[0]: %s\n", argv[0]);
  6.  
  7. if (argc > 1)
  8. printf("argv[1]: %s\n", argv[1]);
  9.  
  10. return 0;
  11. }
  12. MSH_CMD_EXPORT(mycmdarg, my command with args);

当我们在命令行下运行这个命令时,特别是以不同的参数运行时,会发现:

  1. msh /> mycmdarg
  2. argv[0]: mycmdarg
  3.  
  4. msh /> mycmdarg 0
  5. argv[0]: mycmdarg
  6. argv[1]: 0
  7.  
  8. msh /> mycmdarg str 1 2 3
  9. argv[0]: mycmdarg
  10. argv[1]: str

即,

  • argc - 反映的是总计有多少个命令行参数(也包含命令行自身);
  • argv - 反映的是命令行参数组,且都是以字符形式存储;
    从上的例子可以看出,一个msh导出函数很类似于一个main函数:
  1. int main(int argc, char** argv);

最初的msh设计确实就是按照主函数方式进行的,所以其命令行参数传递风格也和main函数完全一致。当对命令行参数进行完整的校验时,就可以确保参数的合法性,并对非法的参数提供出相应的错误信息出来。

使用宏导出命令的形式,

  1. MSH_CMD_EXPORT(cmd, cmd description);

可以导出到msh下。实际上,使用finsh的函数导出宏也可以导出成msh的命令,两者的差别是函数命令在实际存放时,msh的命令名字上会多出_cmd的前缀。例如以下的finsh导出宏定义也同样的可以在msh中导出对应的命令:

  1. FINSH_FUNCTION_EXPORT_ALIAS(cmd_ls, __cmd_ls, List information about the FILEs.);

这里面就是把cmdls函数重命名成_cmd_ls导出到shell中。当执行这个命令时,它会被特殊对待,只能当成msh命令使用。实际上,纯粹的finsh shell在显示命令时,对开头的函数名并不显示,会被当成一类特殊的命令对待(例如提供给msh的函数命令)。