Перенаправление «команда не найдена» в файл - PullRequest
0 голосов
/ 08 апреля 2019

Итак, я пишу код для проекта, над которым я работаю.Речь идет о перенаправлении ввода вывода и ошибки с помощью файловых дескрипторов.Но есть проблема в перенаправлении ошибок.Если бы я находился в командной строке, я бы обычно делал это с помощью этой команды:

    lsa >& out

Эта команда, в свою очередь, записывала бы сообщение об ошибке в файл «out», говоря «bash: lsa: команда не найдена»

В моем проекте я делаю это так:

    ./proj ls GTAMP out

Ошибка перенаправляется в файл 'out', но это будет: "lsa: Нет такого файла или каталога"

Вот как я это делаю

    //Before Child
    int stdin = dup(0);
    int stdout = dup(1);
    int stderr = dup(2);

            printf("GTAMP\n");
            int fderr = open(argv[argc-1], O_WRONLY | O_CREAT | O_TRUNC, 0666);
            dup2(fderr,2);
            dup2(fderr,1);
            close(fderr);
    //In child
    returnVal= fork();  
    if(returnVal==0)
    {
    char *args[] = {argv[2],argv[3],argv[4],NULL};                
                    execvp(argv[2], args);
                    perror(argv[2]);
                    exit(errno);
    }
    //In Parent
        wait(NULL);
        dup2(stdin,0);
        dup2(stdout,1);
        dup2(stderr,2);
        printf("\nCommand(s) execution complete.\n");
        return 0;

1 Ответ

1 голос
/ 08 апреля 2019

«команда не найдена» не является ошибкой на уровне операционной системы - как вы продемонстрировали в своем коде, поиск осуществляется с помощью perror(), чтобы найти строку, связанную с текущим errno.

Вместо этого оболочки типа bash на самом деле жестко кодируют строку command not found.Чтобы процитировать реализацию (execute_cmd.c, из снимка bash-20180420):

          hookf = find_function (NOTFOUND_HOOK);
          if (hookf == 0)
            {
              /* Make sure filenames are displayed using printable characters */
              pathname = printable_filename (pathname, 0);
              internal_error (_("%s: command not found"), pathname);
              exit (EX_NOTFOUND);       /* Posix.2 says the exit status is 127 */
            }

Для сравнения с другой оболочкой dash не излучает foo: command not found, а просто излучает foo: not found;он создается с помощью функции errmsg в src/error.c, которая вызывается из функции shellexec в src/exec.c:

    exerror(EXEND, "%s: %s", argv[0], errmsg(e, E_EXEC));

...invoking ...

const char *
errmsg(int e, int action)
{
    if (e != ENOENT && e != ENOTDIR)
        return strerror(e);

    if (action & E_OPEN)
        return "No such file";
    else if (action & E_CREAT)
        return "Directory nonexistent";
    else
        return "not found";
}

Короче говоря: ни в одной оболочке строка "команда не найдена" возникла где-либо за пределами исходного кода самой оболочки.Если вы хотите, чтобы ваша собственная оболочка написала эту ошибку, вы должны написать код, необходимый для этого.

...