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
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.
alias proj='cd ~/enedil/projects/algo'cd ~/projects/algo? É uma ideia!