chdir (<diretório>) não altera o diretório depois de sair para o shell

8

Eu queria fazer um Cprograma simples para mudar para o diretório do meu projeto. Seu conteúdo é o seguinte:

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

Eu o compilei com o seguinte comando ( pro.cé o nome do arquivo):

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

Não houve erros nem avisos. Mas quando eu o executo, ele não altera o diretório. Por quê?

enedil
fonte
1
Você pode usar um alias em vez -alias proj='cd ~/enedil/projects/algo'
Michael Durrant
@MichaelDurrant oh, você quis dizer cd ~/projects/algo? É uma ideia!
8119 enedil
1
Isso é por design!
Thorbjørn Ravn Andersen

Respostas:

15

Seu programa é exatamente o que você diga a ele para fazer: ela muda o diretório de trabalho para si a /home/enedil/projects/algo. Mas assim que sai, o diretório de trabalho do shell é restaurado.

Eu acho que o que você deseja alcançar é alterar o diretório de trabalho do processo pai, ou seja, o shell, sem recorrer a um simples cd. Existe um método , mas como o autor diz: não faça.

Kempniu
fonte
8
Nitpick, mas o diretório de trabalho do shell não é restaurado, porque nunca mudou. O shell é simplesmente um processo, assim como o programa. Cada programa possui seu próprio diretório de trabalho.
284 Patrick
1
@ Patrick, é verdade. Conceitualmente mais preciso, seu diretório de trabalho é restaurado, pois seu processo é "restaurado" (está ativo em primeiro plano).
Paul Draper
5

O diretório de trabalho atual é local para o processo. Então, o que você quer não é possível.

vinc17
fonte
1

Você também pode usar a CDPATHvariável ambiental. Como explicado em 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".

Então, por exemplo, você pode adicionar esta linha ao seu ~/.profile:

CDPATH=~/projects

Agora você pode executar cd projectsde qualquer diretório e ir para ~/projects.

BLIELI
fonte
0

Para fazer isso no shell, use o sourcecomando (aliasado a .). Ele executará o aplicativo no contexto do shell atual, em vez de criar um novo contexto de shell. É assim que você também pode definir variáveis ​​de ambiente. Se você observar todos os scripts de inicialização em /etc/rc.dou /etc/init.d, verá muitos scripts incluídos por outros scripts com o comando

. /etc/init.d/rcvars

O .faz com que o script de /etc/init.d/rcvarsmodo que qualquer coisa que muda persiste no ambiente atual.

Walter
fonte
1
Você não pode executar um programa C dessa maneira, apenas um script de shell.
John Kugelman