Am vrut să fac un program simplu C
pentru a trece la directorul meu de proiect. Conținutul său este după cum urmează:
#include <unistd.h> int main() { chdir("/home/enedil/projects/algo"); return 0; }
L-am compilat cu următoarea comandă (pro.c
este numele fișierului său):
gcc pro.c -o /usr/local/bin/pro
Nu au existat erori și nici avertismente. Dar când îl rulez, nu schimbă directorul. De ce?
Comentarii
Răspunde
Programul tău face exact ceea ce îi spui să facă: schimbă directorul de lucru pentru în sine în /home/enedil/projects/algo
. Dar odată ce iese, directorul de lucru shell „s este restaurat.
Presupun ce vrei a realiza este să schimbi directorul de lucru al procesului părinte, adică shell-ul, fără a recurge la un simplu cd
. Există a metoda , dar așa cum spune autorul său: nu o faceți.
Comentarii
- Nitpick, dar shell-ul nu este restaurat, deoarece nu s-a schimbat niciodată. Shell-ul este pur și simplu un proces, la fel ca programul. Fiecare program are propriul director de lucru '.
- @Patrick, adevărat. Conceptual mai precis ar fi dvs. directorul de lucru este restaurat, în sensul că procesul dvs. este " restaurat " (este activ în prim-plan).
Răspuns
Directorul de lucru curent este local pentru proces. Deci, ceea ce doriți nu este posibil.
Răspundeți
Puteți utiliza și CDPATH
variabila de mediu. Așa cum se explică în 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".
Deci, de exemplu, puteți adăuga această linie la ~/.profile
:
CDPATH=~/projects
Acum puteți rula cd projects
din orice director și mutați la ~/projects
.
Răspuns
Pentru a face acest lucru pentru shell, utilizați source
(aliasată la .
). Va rula aplicația în contextul shell-ului curent, mai degrabă decât în crearea unui nou context shell. Acesta este modul în care puteți seta și variabile de mediu. Dacă observați toate scripturile de pornire din /etc/rc.d
sau /etc/init.d
, veți vedea o mulțime de scripturi care sunt incluse de alte scripturi cu comanda
. /etc/init.d/rcvars
.
determină scriptul /etc/init.d/rcvars
astfel încât orice modificările persistă în mediul actual.
Comentarii
- Puteți ' să rulați un program C în acest fel, doar un script shell.
alias proj='cd ~/enedil/projects/algo'
cd ~/projects/algo
? Este o idee!