我的自定义外壳程序程序仅重定向一行

时间:2018-12-05 18:58:35

标签: c shell

我们正在尝试制作一个简单的外壳。目前,在此Shell中,每个内置linux命令均可正常运行。例如ls打印:

bbb.txt  cccc.txt  cmake-build-debug  CMakeLists.txt  e444.txt  library.c  library.h  mainSetup  mainSetup.c  nnnn.txt  qwe.txt  wqeqwe.txt  yyyy.txt

当我尝试将此输出重定向到文件时,它仅写入当前创建的文件。例如,我写入myfile.txt的ls > myfile.txt内容将是myfile.txt。我不知道为什么它只打印其行而忽略其他行。这是我的重定向代码:

    int fd = open(findTheLastArg(args, 0), O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
                    dup2(fd, 1);   // make stdout go to file
                    close(fd);
 splitter(args);

findTheLastArg(args, 0)在命令行中返回文件名。

splitter(args)包含execl函数,并且在我不尝试重定向任何内容时正常工作。

编辑:我的设置 NULL 方法是:

void setFileAndArrowNull(char *args[], int counter){

    for(int i=0; i < counter; i++){

        if (strcmp(args[i], ">") == 0) {
            args[i] = NULL;
            args[i+1] = NULL;
            args[i+2] = NULL;
            return;
        }

    }

}

我在这里调用此方法:

  if(redirect){
                    setFileAndArrowNull(argv, 0);
                }
exec(....);
当行包含“>”时,

重定向变为1。程序将在此输入。

1 个答案:

答案 0 :(得分:1)

根据您的描述和对代码的了解,我猜您不会从arguments数组中删除>myfile.txt

如果输入:

ls > myfile.txt

然后执行程序所使用的参数数组必须为:

{"ls", NULL}

不能是:

{"ls", ">", "myfile.txt", NULL}

因为在那种情况下,它只会显示一个错误,并且输出文件将只包含它自己,就像您看到的一样。