我们正在尝试制作一个简单的外壳。目前,在此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。程序将在此输入。
答案 0 :(得分:1)
根据您的描述和对代码的了解,我猜您不会从arguments数组中删除>
和myfile.txt
。
如果输入:
ls > myfile.txt
然后执行程序所使用的参数数组必须为:
{"ls", NULL}
不能是:
{"ls", ">", "myfile.txt", NULL}
因为在那种情况下,它只会显示一个错误,并且输出文件将只包含它自己,就像您看到的一样。