chdir (< diretório >) não ' muda de diretório após sair para o shell

Eu queria fazer um programa C 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 muda de diretório. Por quê?

Comentários

  • Você pode usar um alias – alias proj='cd ~/enedil/projects/algo'
  • @MichaelDurrant oh, você quis dizer cd ~/projects/algo? É uma ideia!
  • Isso ocorre por design!

Resposta

Seu programa faz exatamente o que você diz: muda o diretório de trabalho do próprio para /home/enedil/projects/algo. Mas assim que sai, o shell “s diretório de trabalho é restaurado.

Acho que você quer alcançar é mudar o diretório de trabalho do processo pai, ou seja, o shell, sem recorrer a um cd simples. Há um método , mas como seu autor diz: não faça isso.

Comentários

  • Nitpick, mas o shell ' O diretório de trabalho não foi ' restaurado porque nunca foi alterado. O shell é simplesmente um processo, assim como o programa. Cada programa possui seu próprio diretório de trabalho '.
  • @Patrick, true. Conceitualmente mais preciso seria seu diretório de trabalho fosse restaurado, em que seu processo fosse " restaurado " (é ativo em primeiro plano).

Resposta

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

Resposta

Você também pode usar a CDPATH variável ambiental. Conforme 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 projects de qualquer diretório e mover para ~/projects.

Resposta

Para fazer isso para o shell, use o source comando (alias para .). 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 as variáveis de ambiente. Se você observar todos os scripts de inicialização em /etc/rc.d ou /etc/init.d, verá muitos scripts incluídos por outros scripts com o comando

. /etc/init.d/rcvars 

O . faz com que o script /etc/init.d/rcvars para que qualquer coisa as mudanças persistem no ambiente atual.

Comentários

  • Você pode ' t executar um programa C desta forma, apenas um script de shell.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *