chdir в пользовательской оболочке в Unix

Я работаю над проектом и столкнулся с небольшой проблемой. Он разработан как простая оболочка, и прямо сейчас я работаю над вводом встроенных команд (pwd, cd, exit). У меня работает все, кроме CD.

Разбор работает, и разные сегменты команды и аргументы помещаются в массив, так что прямо сейчас у меня есть это:

void cd()
{
  chdir(commands[1].c_str());

  reset();
}

Я запускаю это с допустимым путем, который находится в этом каталоге, но он не меняется. Что мне не хватает?

Спасибо!


person timgregoire    schedule 16.02.2016    source источник
comment
Если это не работает, проверьте статус возврата chdir и errno, который скажет вам, что не так. У вас есть права на выполнение в каталоге, к которому вы переходите?   -  person Michael Albers    schedule 16.02.2016
comment
@MichaelAlbers Только что попробовал, добавил заголовок errno.h и добавил для него cout в той же функции, ничего не вернулось, поэтому не похоже, что я где-либо получаю какие-либо ошибки. И никаких предупреждений при компиляции, все работает нормально   -  person timgregoire    schedule 16.02.2016
comment
Что значит ничего не вернули? По определению chdir возвращает целое число. Вы имеете в виду, что он вернул ноль? Откуда вы знаете, что каталог не меняется?   -  person Michael Albers    schedule 16.02.2016
comment
@MichaelAlbers Да, вернул 0.   -  person timgregoire    schedule 16.02.2016
comment
@MichaelAlbers Может сказать, что каталог не меняется, потому что сразу после запуска PWD (getenv(PWD)) он по-прежнему показывает исходный каталог, в котором была запущена программа.   -  person timgregoire    schedule 16.02.2016
comment
Системный вызов chdir() не влияет на переменные среды вашей оболочки и, следовательно, не PWD в частности. Обычная оболочка устанавливает значение в $PWD при выполнении cd; значение в $PWD не меняется, пока его не изменит оболочка.   -  person Jonathan Leffler    schedule 16.02.2016


Ответы (1)


Вы комментируете:

Могу сказать, что каталог не меняется, потому что сразу после запуска PWD (getenv("PWD")) он по-прежнему показывает исходный каталог, в котором была запущена программа.

Вы неправильно проверяете текущий рабочий каталог. См. chdir(), не влияющий на переменную среды PWD

Вместо использования getenv("PWD") используйте getcwd.

person Michael Albers    schedule 16.02.2016