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!