【问题标题】:My custom shell program redirects only one line我的自定义 shell 程序只重定向一行
【发布时间】:2019-05-07 10:04:16
【问题描述】:

我们正在尝试制作一个简单的外壳。在这个 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

当我尝试将此输出重定向到一个文件时,它只写入当前创建的文件。例如我写ls > myfile.txt 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 函数,并且在我不尝试重定向任何内容时正常工作。

编辑:我的 set 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(....);
当行包含“>”时,

Redirect 变为 1。程序进入这个if。

【问题讨论】:

标签: c shell


【解决方案1】:

根据您对代码的描述和一瞥,我猜您不会从参数数组中删除 &gt;myfile.txt

如果你输入:

ls > myfile.txt

那么你执行程序的参数数组必须是:

{"ls", NULL}

不可能:

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

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

【讨论】:

  • 感谢您的回答。我已经试过你告诉我的了。我昨天尝试将箭头设置为空,但从未想过将其他部分设置为空。所以今天我也尝试将它们设置为空。但我仍然得到相同的结果。我添加了我的 setNull 方法以及我使用它们的位置。你能帮帮我吗?
  • 如果你运行echo hello &gt; myfile.txt,文件的内容是什么?
  • hello myfile.txt
  • 听起来像&gt; 被删除,而myfile.txt 不是。您可以使用调试器或strace -f 进行检查
  • 我刚刚注意到我的程序从未在 set Null 方法中输入 if 语句。我有完全相同的方法来检查后台进程的“&”并且工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 2016-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
相关资源
最近更新 更多