我正在用输入和输出重定向在C中实现一个shell。我可以成功进行输入重定向,但是输出重定向将无法工作。例如,如果我执行ls > out.txt
,则out.txt包含文本“ out.txt”,而不是ls
命令的结果。
我查看了其他堆栈溢出答案以及open()和creat()文档,但未能解决问题。
如果检测到输出重定向(>),这是我当前拥有的代码:
if(outRedirect == 1)
{
//I have tried using open() and creat()
//int out = open(args[1], O_WRONLY|O_CREAT|O_TRUNC, 0640);
int out = creat(args[1], 0640);
dup2(out, STDOUT_FILENO);
close(out);
//reset flag to 0
outRedirect = 0;
//execute command
execvp(args[0], args);
}
我希望out.txt文件包含:
a.out
in.txt
makefile
out.txt
README
simple-shell
simple-shell.c
但包含
out.txt
答案 0 :(得分:0)
将相关评论转换为答案。
您必须从命令行中删除重定向文本。命令看不到shell完成的任何重定向。您可能会要求将文件列出到文件中。
“我必须从命令行中删除重定向文本”是什么意思?
您必须确保在您的shell执行ls > out.txt
时,>
和out.txt
都不会传递给ls
。我怀疑您正在传递文件名。至少,这是为什么您仅在输出文件中看到文件名的解释。
我认为您最终要执行的命令是
ls out.txt
。就像乔纳森(Jonathan)所说的那样,您不会删除第二个参数。这导致ls
仅打印out.txt
(因为它在目录中),这就是输出的全部内容。
谢谢你们!最终成为我的问题。