chdir (< director >) nu ' nu schimbă directorul după ieșirea la shell

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

  • În schimb, ai putea folosi un alias – alias proj='cd ~/enedil/projects/algo'
  • @MichaelDurrant oh, ai vrut să spui cd ~/projects/algo? Este o idee!
  • Aceasta este prin design!

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *