2012-02-03 2 views
2

Я создал небольшую мини-оболочку, и пусть пользователь вводит команду типа «ls», и она отобразит содержимое каталога, как это предполагается, используя execv() в моем коде, но это похоже, не работает, когда пользователь вводит что-то вроде set set = bob. Я искал повсюду, что я должен использовать в своем коде для выполнения команды set, когда пользователь вводит ее, и лучшее, что я могу найти, это system(), но это все еще не работает для меня. Есть идеи?Выполнение команды SET в c-программе

+0

Это похоже на один из моих первых проектов в школе. A WHOLE LOT ... – Eregrith

+0

Что вы думаете? – user1186710

ответ

0

Поскольку вы выполняете fork-and-exec или систему(), команда запускается в отдельном процессе. Что происходит в этом процессе (например, установка переменной окружения) не влияет на среду родителя. (Отдельный вопрос в том, что set не создает переменную окружения. Вы должны были бы export в [ба] ш или setenv [т] CSH, чтобы сделать это.)

Так что вам нужно закодировать ваш мини- shell для обработки команды set явно, а не передачи ее другой программе.

1

set - это командная оболочка, а не внешняя команда (в действительности это должен быть предполагаемый эффект, который заключается в изменении переменной оболочки в самом процессе оболочки).

Это означает, что вам нужно искать и обрабатывать set в самой оболочке, добавив именованную переменную в некоторую внутреннюю структуру данных, которая отслеживает переменные оболочки (или обновляет ее, если она уже существует).

+0

Значит ли это, что мне придется написать свою собственную команду set в моей мини-скорлупе, которая сделает что-то похожее на встроенную команду set? – user1186710

+0

@ user1186710: Правильно - если вы хотите поддерживать 'set', то есть. – caf

+0

Отличное спасибо! – user1186710

0

Возможно, вы захотите посмотреть на setenv (3) и getenv (3). Это функции для изменения и чтения переменных среды из программы C.

+0

Но это не позволит мне создавать переменные? – user1186710

+0

На странице man: «Функция setenv() добавляет переменную _name в среду со значением _value« Итак, да, да. – user732933

Смежные вопросы