Пользовательская оболочка не распознает последнюю переданную ей команду

#c

#c

Вопрос:

Я пытаюсь реализовать пользовательскую оболочку Unix, однако последняя передаваемая ей команда никогда не распознается. Когда я запускаю «ls», ничего не происходит, но если я выполняю «ls ls», это действует так, как будто был передан только один ls, или если я выполняю «ls -o», это выполняет только «ls», но если я выполняю «ls -o -o», это выполняет «ls -o», это должно функционировать аналогично стандартной оболочке Unix.

 #include "apue.h"
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int parse(char* buf, char **cmds);
static void sig_int(int);       
int
main(void)
{


    char *path;
        path = getenv("PATH");
    char    buf[MAXLINE];   
     char *envp[] = {path, NULL};
    pid_t   pid;
    int     status;
    char *command[MAXLINE];
    char *input; 
    if (signal(SIGINT, sig_int) == SIG_ERR)
        err_sys("signal error");
    printf("%% "); 
    while (fgets(buf, MAXLINE, stdin) != NULL) {
            parse(buf, command);





        if ((pid = fork()) < 0) {
            err_sys("fork error");
        } else if (pid == 0) {      /* child */

            input = command[0];
            execvpe(input, command, envp);
            err_ret("couldn't execute: %s", buf);
            exit(127);
        }

        /* parent */
        if ((pid = waitpid(pid, amp;status, 0)) < 0)
            err_sys("waitpid error");
        printf("%% ");

            }
    exit(0);

}

/*parses input into something runable*/
int parse(char* buf, char **cmds)
{
    char *sep;
    int count;
    count = 0;
    while((sep = strchr(buf, ' ')))
    {
        cmds[count]= buf;
        *sep = '';
        buf = sep  1;
        count  ;
        while (*buf amp;amp; (*buf == ' ')) /* Ignore spaces */
                    buf  ;
    }
    cmds[count] = NULL;
    if(count == 0)
        return 1;
    return 0;
}

  

Комментарии:

1. Ваш код не компилируется без изменений (нам не хватает по крайней мере одного файла заголовка, а также нескольких функций ( err_sys и err_ret ). Также ваша функция синтаксического анализа не выполняет то, что вы ожидаете, когда в вашей команде нет места.

2. После последнего аргумента нет пробела, поэтому strchr возвращается NULL , и он игнорируется.