chdir (< katalog >) nie ' t zmienia katalogu po wyjściu do powłoki

Chciałem stworzyć prosty C program do przejścia do katalogu mojego projektu. Jego zawartość jest następująca:

#include <unistd.h> int main() { chdir("/home/enedil/projects/algo"); return 0; } 

Skompilowałem go za pomocą następującego polecenia (pro.c to nazwa pliku):

gcc pro.c -o /usr/local/bin/pro 

Nie było błędów ani ostrzeżeń. Ale kiedy go uruchamiam, nie zmienia katalog. Dlaczego?

Komentarze

  • Zamiast tego możesz użyć aliasu – alias proj='cd ~/enedil/projects/algo'
  • @MichaelDurrant och, miałeś na myśli cd ~/projects/algo? To pomysł!
  • To jest zgodne z projektem!

Odpowiedź

Twój program robi dokładnie to, co mu każesz: zmienia katalog roboczy dla samego na /home/enedil/projects/algo. Ale po zakończeniu przywracany jest katalog roboczy shell „s .

Zgaduję, czego chcesz do osiągnięcia jest zmiana katalogu roboczego procesu nadrzędnego, tj. powłoki, bez uciekania się do prostego cd. Istnieje a metoda , ale jak mówi jej autor: nie rób tego.

Komentarze

  • Nitpick, ale powłoka ' nie został ' przywrócony, ponieważ nigdy się nie zmienił. Powłoka jest po prostu procesem, tak jak program. Każdy program ma swój własny katalog roboczy '.
  • @Patrick, prawda. Koncepcyjnie dokładniej byłoby, gdyby Twój katalog roboczy został przywrócony, ponieważ proces został " przywrócony " (jest aktywny na pierwszym planie).

Odpowiedź

Bieżący katalog roboczy jest lokalny dla procesu. Więc to, czego chcesz, nie jest możliwe.

Odpowiedź

Możesz także użyć CDPATH zmienna środowiskowa. Jak wyjaśniono w 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". 

Na przykład możesz dodać tę linię do swojego ~/.profile:

CDPATH=~/projects 

Możesz teraz uruchomić cd projects z dowolnego katalogu i przenieść do ~/projects.

Odpowiedź

Aby to zrobić dla powłoki, użyj source polecenie (alias do .). Uruchomi aplikację w kontekście bieżącej powłoki, zamiast tworzyć nowy kontekst powłoki. W ten sposób możesz również ustawić zmienne środowiskowe. Jeśli zauważysz wszystkie skrypty startowe w /etc/rc.d lub /etc/init.d, zobaczysz wiele skryptów dołączonych do innych skryptów z poleceniem

. /etc/init.d/rcvars 

. powoduje, że skrypt /etc/init.d/rcvars zmienia się i utrzymuje się w bieżącym środowisku.

Komentarze

  • Możesz ' t uruchomić program w języku C w ten sposób tylko skrypt powłoki.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *