2010-09-04 4 views
4

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

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));  
    } 
} 

Выход: (расположение исполняемого файла/главная/пользователя)

changedir/ботинок изменился

Справочник. Настоящий рабочий каталог «/ home/user» «/ boot»

ответ

6

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

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

+0

Так что же означает PWD в этом смысле? Настоящий рабочий каталог уже изменился. – 2010-09-04 11:35:48

+1

PWD - это рабочий каталог в оболочке. Программа C имеет другой рабочий каталог - она ​​начинается с той же самой, что и вызывающая оболочка, а затем chdir меняет рабочий каталог программы C, который не может повлиять на каталог оболочки. – Mark

+2

@crypto: переменные окружения не являются волшебными. Они изменяются только тогда, когда приложение явно меняет их, поэтому, если ваше приложение никогда не изменяет 'PWD', тогда значение' PWD' является «текущим каталогом при запуске приложения». – caf

3

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

Возможно, вы также заметите, что когда ваша программа закончится, оболочка все еще находится в каталоге, в котором вы начали. Оболочка не изменила каталог, поэтому PWD не изменился.

+0

поэтому, если бы я написал этот код как часть моей собственной оболочки, должен ли я изменить переменную PWD? Будет ли какая-то конкретная потребность в этом? – 2010-09-04 12:29:21

+0

@crypto, нужна ли ваша оболочка? Это будет зависеть от того, что вы делаете со своей оболочкой. Я даже не знаю, имеет ли csh PWD. –

+0

точка взята, я просто имею в виду, что это задача оболочки для поддержания переменных окружения, или они должны просто представлять состояние при запуске оболочки? – 2010-09-04 13:31:45

3

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

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