我正在尝试在我的简单 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[] 指针的事实。