将“找不到命令”重定向到文件

时间:2019-04-08 16:27:04

标签: bash command-line-arguments stderr

所以我正在为我正在从事的项目编写代码。这是关于使用文件描述符重定向输入输出和错误。但是错误重定向存在问题。如果我在命令行中,通常可以使用以下命令:

    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 个答案:

答案 0 :(得分:1)

“找不到命令”不是操作系统级别的错误-正如您在代码中所演示的那样,这些错误是通过使用perror()查找与当前{{1}相关联的字符串来查找的}。

相反,像bash这样的shell实际上将字符串errno硬编码。引用实施({command not found,来自bash-20180420快照):

execute_cmd.c

与另一个shell进行比较, 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;这是通过src/error.c中的foo: not found函数构造的,如src/exec.c中的errmsg函数所调用的:

shellexec

...正在调用...

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

简而言之:在两个shell中,字符串“找不到命令”都不起源于shell本身的源代码之外的任何地方。如果您希望自己的shell编写该错误,则应编写必要的代码。