chdir () не влияет на переменную окружения PWD - PullRequest
5 голосов
/ 04 сентября 2010

Когда я использую chdir () для изменения текущего рабочего каталога, почему getenv ("PWD") не дает текущий рабочий каталог? Нужно ли также использовать setenv ("PWD", newDir, 1)?

void intChangeDir(char *newDir)
{
    if( chdir(newDir)==0 )              
    {
        printf("Directory changed. The present working directory is \"%s\" \"%s\"\n",getenv("PWD"),getcwd(NULL,0));
    }
    else
    {
        printf("Error changing dir %s\n",strerror(errno));      
    }
}

Вывод: (расположение исполняемого файла - / home / user)

Изменен / boot

Каталог изменен. Текущий рабочий каталог - "/ home / user" "/ boot"

Ответы [ 3 ]

6 голосов
/ 04 сентября 2010

Да, если вы хотите изменить переменную среды, вы должны сделать это явно.

Это оболочка, которая устанавливает и обновляет PWD при обычном запуске событий, поэтому она отражает только изменения текущего каталога, известного оболочке.

3 голосов
/ 04 сентября 2010

Переменная среды PWD не обновляется автоматически chdir, поэтому вам придется делать это явно, используя setenv.Однако функция getcwd все равно должна автоматически сообщать об обновленном значении.

3 голосов
/ 04 сентября 2010

"getenv" получает PWD из среды, из которой запущена программа.«PWD», равный текущему рабочему каталогу, является чем-то поддерживаемым оболочкой, и, поскольку вы изменили каталог в программе, которую вы запустили из оболочки, а не из оболочки, PWD не изменился в среде.Вы, вероятно, также заметите, что когда ваша программа заканчивается, оболочка все еще находится в каталоге, в котором вы начали.Оболочка не изменила каталог, поэтому PWD не изменился.

...