命令执行查找顺序
ttinyShell 是一个功能强大的命令行工具,除了能够执行内建命令,还可以执行用户自定义的应用程序。要执行应用程序,我们使用与执行内建命令相同的方法,根据命令字段或应用程序文件名进行匹配。默认情况下,内建命令在当前 Shell 线程中执行,但也可以选择在单独的后台线程中进行同步或异步执行。对于应用程序,则会创建一个新的进程来执行。
在 ttinyShell 中,查找可执行对象的顺序如下。一旦找到可执行对象,就会执行相应的操作,并放弃后续的查找过程:
- 首先,检查命令是否是一个文件路径。如果存在且是一个可执行文件,则执行指定的应用程序。
- 如果命令不是一个文件路径,则继续检查环境变量 PATH。PATH 变量包含了多个路径,按顺序逐个检查是否存在与命令字段相同的可执行文件。如果找到匹配的应用程序,则执行该应用程序。
- 如果上述两步都未找到可执行对象,那么尝试判断命令是否是一个内建命令。如果是内建命令,则在当前 Shell 线程中执行相应的内建命令。
- 如果以上步骤都没有找到可执行目标,ttinyShell 将打印错误信息,提示用户未找到相应的命令或应用程序。
通过这样的查找顺序,ttinyShell 能够快速准确地找到需要执行的命令或应用程序。这种设计使得 ttinyShell 更加灵活和易于使用,同时保证了执行效率和正确性。
Shell命令执行举例。一个系统中存在同名的内建命令cmdtest和应用程序cmdtest,应用程序存储于 /apps/cmdtest/cmdtest
。
cmdtest 应用程序:
#include <stdio.h>
int main (int argc, char **argv)
{
printf("cmdtest app\n");
printf("tid = %x\n", (ULONG)API_ThreadIdSelf());
return (0);
}
cmdtest 内建命令:
static INT cmdtest (INT iArgC, PCHAR ppcArgV[])
{
printf("cmdtest\n");
printf("tid = %x\n", (ULONG)API_ThreadIdSelf());
return (0);
}
启动系统,查看当前线程,可知当前Shell线程号为4010014。直接执行 cmdtest
命令,显示cmdtest,说明该命令调用的是内建命令,且执行线程号与Shell线程号一致,说明内建命令是在Shell线程下执行的。
[root@sylixos:/root]# ts
thread show >>
NAME TID PID PRI STAT LOCK SAFE DELAY PAGEFAILS FPU CPU
---------------- ------- ----- --- ---- ---- ---- ---------- --------- --- ---
t_idle0 4010000 0 255 RDY 0 YES 0 0 0
t_itimer 4010001 0 20 SLP 0 YES 6702 0 0
t_isrdefer 4010002 0 0 SEM 0 YES 0 0 0
t_except 4010003 0 0 SEM 0 YES 0 0 0
t_log 4010004 0 60 MSGQ 0 YES 0 0 0
t_power 4010005 0 254 SLP 0 YES 2 0 0
t_hotplug 4010006 0 250 SEM 0 YES 2 0 0
t_reclaim 4010008 0 253 MSGQ 0 YES 0 0 0
t_sync 4010009 0 252 SLP 0 102 0 0
t_dcwpipe 401000a 0 160 SEM 0 0 0 0
t_tpsfs 401000b 0 160 SLP 0 104 0 0
t_netjob 401000c 0 110 SEM 0 YES 0 0 0
t_netproto 401000d 0 110 MSGQ 0 YES 10 0 0
t_snmp 401000e 0 110 MSGQ 0 YES 0 0 0
t_ftpd 401000f 0 160 MSGQ 0 0 0 0
t_telnetd 4010010 0 160 MSGQ 0 YES 0 0 0
t_xinput 4010012 0 200 SEM 0 0 0 0
t_tshell 4010014 0 150 RDY 1 0 0 0
thread: 18
[root@sylixos:/root]# cmdtest
cmdtest
tid = 4010014
[root@sylixos:/root]#
直接执行 /apps/cmdtest/cmdtest
,输出“cmdtest app”,说明该命令调用的是应用程序,且执行线程是新的线程号,说明APP在独立线程执行的而不是Shell线程执行的。将APP路径添加到PATH环境变量中,在直接执行cmdtest命令,有输出可知实际调用的还是应用程序而不是内建命令,可知应用程序的执行优先级高于内建命令,当一个命令同时可以调用应用程序和内建命令时,只执行应用程序,内建命令被屏蔽。执行线程号比上次加一,说应用程序每执行一次都会重新创建线程。
[root@sylixos:/root]# /apps/cmdtest/cmdtest
cmdtest app
tid = 401001b
[root@sylixos:/root]# PATH=${PATH}:/apps/cmdtest
[root@sylixos:/root]# cmdtest
cmdtest app
tid = 401001c
[root@sylixos:/root]#