命令执行查找顺序

更新时间:
2024-03-14
下载文档

命令执行查找顺序

ttinyShell 是一个功能强大的命令行工具,除了能够执行内建命令,还可以执行用户自定义的应用程序。要执行应用程序,我们使用与执行内建命令相同的方法,根据命令字段或应用程序文件名进行匹配。默认情况下,内建命令在当前 Shell 线程中执行,但也可以选择在单独的后台线程中进行同步或异步执行。对于应用程序,则会创建一个新的进程来执行。

在 ttinyShell 中,查找可执行对象的顺序如下。一旦找到可执行对象,就会执行相应的操作,并放弃后续的查找过程:

  1. 首先,检查命令是否是一个文件路径。如果存在且是一个可执行文件,则执行指定的应用程序。
  2. 如果命令不是一个文件路径,则继续检查环境变量 PATH。PATH 变量包含了多个路径,按顺序逐个检查是否存在与命令字段相同的可执行文件。如果找到匹配的应用程序,则执行该应用程序。
  3. 如果上述两步都未找到可执行对象,那么尝试判断命令是否是一个内建命令。如果是内建命令,则在当前 Shell 线程中执行相应的内建命令。
  4. 如果以上步骤都没有找到可执行目标,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]#
文档内容是否对您有所帮助?
有帮助
没帮助