【发布时间】: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。
【问题讨论】:
-
请发minimal reproducible example(并修正缩进)。
-
我不确定 this post is 的相关性如何,但它可能会有所帮助...
-
@ryyker 感谢我之前尝试过,但结果相同。