每行有多个命令的命令行解释器

Posted

技术标签:

【中文标题】每行有多个命令的命令行解释器【英文标题】:command line interpreter with multiple commands per line 【发布时间】:2017-07-16 23:12:10 【问题描述】:

我想编写一个命令行解释器,每行包含多个命令。

我用 C 语言编写了一个程序,它适用于每行 1 个命令,但是如果我输入更多命令不起作用,则输入命令如下: ls -l ;密码;猫文件; ls.

首先我解析参数,我把它们放入数组中,我有这个功能:

pid_t pid;
pid = fork();    

switch(pid) 
    case -1:  
      printf("DEBUG:Fork Failure\n");
      exit(-1);
    case  0:
      execvp(cmd[j], cmd);

      if(execvp(cmd[j], cmd) == -1) 
            printf("Command Not Found\n");
            exit(0);
      

    default:  
    wait(NULL);
    printf("DEBUG:Child Finished\n");

我的解析器是:

printf("shell> ");

fgets (input, MAX_SIZE, stdin);

if ((strlen(input)>0) && (input[strlen (input) - 1] == '\n')) 
    input[strlen (input) - 1] = '\0';



printf("INPUT: %s\n", input);

cnd = strtok(input, " ;");

int i = 0;

while(cnd != NULL)     
    cmd[i] = cnd;
    i++;
    cnd = strtok(NULL, ";");

我认为我必须使用管道来解决我的问题,但是如何? 有什么想法吗?

抱歉英语不好

【问题讨论】:

如果一个命令被正确解析,但多个命令没有,那么你的解析器有问题。你没有显示你的解析器...... 【参考方案1】:

您解释它的方式似乎是您想一个接一个地执行命令,但不让它们相互通信(此外,将ls 的输出通过管道传输到pwd 只是不感觉)。

为此,解决方案很简单:在分号上拆分输入,并处理每个命令,因为它是一个命令(因为它就是这样)。

使用一些伪代码,它可能看起来像这样

input = read_next_line();
while ((next_command = get_next_command(input)) != NULL)

    execute_command(next_command);

您可以使用例如strtok 或类似功能。

【讨论】:

我做到了..我将输入拆分并将其放入数组中,然后检查数组是否正确。当我尝试执行命令时,我看到“找不到命令”

以上是关于每行有多个命令的命令行解释器的主要内容,如果未能解决你的问题,请参考以下文章

pytest-09-参数化parametrize+命令行传参

linux下的shell命令,命令行,终端运行概念的解释???

ELK--filebeat命令行参数解释

Linux的命令行界面

Linux常用命令——xargs

Ionic常用命令行解释