Реализация оболочки в C: перенаправление вывода записывает имя выходного файла в выходной файл, а не результаты команды - PullRequest
0 голосов
/ 12 апреля 2019

Я реализую оболочку на C с перенаправлением ввода и вывода.Я могу успешно выполнить перенаправление ввода, но перенаправление вывода не будет работать.Например, если я сделаю ls > out.txt, out.txt будет содержать текст "out.txt", а не результаты команды ls.

Я посмотрел другие ответы о переполнении стека и открытые () и 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);
}

Iхотите, чтобы файл out.txt содержал:

a.out
in.txt
makefile
out.txt
README
simple-shell
simple-shell.c

, но он содержит

out.txt

1 Ответ

0 голосов
/ 13 апреля 2019

Перенос соответствующих комментариев в ответ.

Вы должны удалить текст перенаправления из командной строки.Команды не видят перенаправления, выполняемого оболочкой.Скорее всего, вы просите перечислить файл в файл.

Что вы имеете в виду, я "должен удалить текст перенаправления из командной строки"?

Вы должны убедиться, что когда ваша оболочка выполняет ls > out.txt, ни >, ни out.txt не передаются в ls.Я подозреваю, что вы передаете имя файла.По крайней мере, это объяснение того, почему вы видите (только) имя файла в выходном файле.

И как Аджай Брахмакшатрия сказал :

Я думаю, что команда, которую вы наконец выполняете, - ls out.txt.Как сказал Джонатан, вы не убираете второй аргумент.Это заставляет ls просто печатать out.txt (поскольку он находится в каталоге), и это все, что входит в вывод.


Спасибо вам обоим!Это стало моей проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...