chdir (<каталог>) не меняет каталог после выхода из оболочки


8

Я хотел сделать простую Cпрограмму, чтобы перейти в каталог моего проекта. Его содержание таково:

#include <unistd.h>
int main()
{
    chdir("/home/enedil/projects/algo");
    return 0;
}

Я скомпилировал его с помощью следующей команды ( pro.cэто имя файла):

gcc pro.c -o /usr/local/bin/pro

Не было ни ошибок, ни предупреждений. Но когда я запускаю его, он не меняет каталог. Почему?


1
Вы могли бы использовать псевдоним вместо этого -alias proj='cd ~/enedil/projects/algo'
Майкл Даррант

@MichaelDurrant о, ты имел в виду cd ~/projects/algo? Это идея!
enedil

1
Это по замыслу!
Турбьёрн Равн Андерсен

Ответы:


15

Ваша программа делает именно то, что вы говорите это сделать: он изменяет рабочий каталог для себя , чтобы /home/enedil/projects/algo. Но как только он выходит, рабочий каталог оболочки восстанавливается.

Я думаю, что вы хотите достичь, это изменить рабочий каталог родительского процесса, то есть оболочки, не прибегая к простому cd. Есть метод , но, как говорит его автор: не делайте этого.


8
Nitpick, но рабочий каталог оболочки не восстанавливается, потому что он никогда не менялся. Оболочка - это просто процесс, как и программа. У каждой программы есть свой рабочий каталог.
Патрик

1
@ Патрик, правда. Концептуально более точным будет восстановление вашего рабочего каталога, в котором ваш процесс «восстанавливается» (активен на переднем плане).
Пол Дрейпер

5

Текущий рабочий каталог является локальным для процесса. Итак, то, что вы хотите, не возможно.


1

Вы также можете использовать CDPATHпеременную среды. Как объяснено в man bash:

   CDPATH The search path for the cd command.  This is  a  colon-separated
          list  of  directories  in  which the shell looks for destination
          directories specified by the cd  command.   A  sample  value  is
          ".:~:/usr".

Так, например, вы можете добавить эту строку в ваш ~/.profile:

CDPATH=~/projects

Теперь вы можете запустить cd projectsиз любого каталога и перейти к ~/projects.


0

Чтобы сделать это для оболочки, используйте sourceкоманду (с псевдонимом .). Он будет запускать приложение в контексте текущей оболочки, а не создавать новый контекст оболочки. Так вы можете установить переменные окружения. Если вы заметите все сценарии запуска в /etc/rc.dили /etc/init.d, вы увидите множество сценариев, которые включены в другие сценарии с помощью команды

. /etc/init.d/rcvars

.Вызывает сценарий /etc/init.d/rcvarsтак , что все , что он изменяет сохраняется в текущей среде.


1
Вы не можете запустить программу на C таким способом, только сценарий оболочки.
Джон Кугельман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.