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

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

enedil
источник
1
Вы могли бы использовать псевдоним вместо этого -alias proj='cd ~/enedil/projects/algo'
Майкл Даррант
@MichaelDurrant о, ты имел в виду cd ~/projects/algo? Это идея!
enedil
1
Это по замыслу!
Турбьёрн Равн Андерсен

Ответы:

15

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

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

Kempniu
источник
8
Nitpick, но рабочий каталог оболочки не восстанавливается, потому что он никогда не менялся. Оболочка - это просто процесс, как и программа. У каждой программы есть свой рабочий каталог.
Патрик
1
@ Патрик, правда. Концептуально более точным будет восстановление вашего рабочего каталога, в котором ваш процесс «восстанавливается» (активен на переднем плане).
Пол Дрейпер
5

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

vinc17
источник
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.

BLIELI
источник
0

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

. /etc/init.d/rcvars

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

Вальтер
источник
1
Вы не можете запустить программу на C таким способом, только сценарий оболочки.
Джон Кугельман