我正在尝试在我的简单shell程序中实现文件重定向。问题是,当我运行shell程序来测试它时(例如/test1>Test2)它不是执行命令并进入下一个提示符,而是暂停并继续接收输入以重定向到我的Test2文件。我不知道该怎么办。
for(int i = 1; i < arg_no; i++){
if (strcmp(arg[i], ">") == 0){
fd = open(arg[i+1], O_WRONLY | O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP);
if (fd < 0) {
perror("open");
exit(1);
}
close(STDOUT_FILENO);
if (dup(fd) < 0) {
perror("dup");
exit(1);
}
close(fd);
arg[i] = NULL;
break;
}
else if(strcmp(arg[i], ">&") == 0){
fd = open(arg[i+1], O_WRONLY | O_CREAT, 0644);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
close(fd);
arg[i] = NULL;
}
else if(strcmp(arg[i], ">>") == 0){
fd = open(arg[i+1], O_WRONLY | O_CREAT | O_APPEND, 0644);
dup2(fd, STDOUT_FILENO);
close(fd);
arg[i] = NULL;
}
else if(strcmp(arg[i] , ">>&") == 0){
fd = open(arg[i+1], O_WRONLY | O_CREAT | O_APPEND, 0644);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
close(fd);
arg[i] = NULL;
}
else if(strcmp(arg[i], "<") == 0){
fd = open(arg[i+1], O_RDONLY);
dup2(fd, STDIN_FILENO);
close(fd);
arg[i] = NULL;
}
}
我在dup(fd)之后的printf语句没有任何效果,所以我假设程序无法关闭(fd),这就是发生这种情况的原因。我只是不知道为什么会这样,也不知道如何强迫它关闭。
如果您在Linux shell中输入以下内容:
./test1 > test2
则test1
与argc == 1
一起执行,没有附加参数。特别是,> test2
不会传递给您的程序。您输入的实际shell将删除这些内容,并为您执行文件重定向。
如果你的程序需要解释包含<
和>
的字符串,你需要把它们用括号括起来,例如
./test1 "> test2"
你必须处理这个参数是一个字符串的事实,而不是一系列argv[]指针。