在C中实现Shell:输出重定向是将输出文件名写入输出文件,而不是命令结果

时间:2019-04-12 19:16:38

标签: c

我正在用输入和输出重定向在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

1 个答案:

答案 0 :(得分:0)

将相关评论转换为答案。

您必须从命令行中删除重定向文本。命令看不到shell完成的任何重定向。您可能会要求将文件列出到文件中。

  

“我必须从命令行中删除重定向文本”是什么意思?

您必须确保在您的shell执行ls > out.txt时,>out.txt都不会传递给ls。我怀疑您正在传递文件名。至少,这是为什么您仅在输出文件中看到文件名的解释。

还有Ajay Brahmakshatriya said

  

我认为您最终要执行的命令是ls out.txt。就像乔纳森(Jonathan)所说的那样,您不会删除第二个参数。这导致ls仅打印out.txt(因为它在目录中),这就是输出的全部内容。


  

谢谢你们!最终成为我的问题。