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
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.
alias proj='cd ~/enedil/projects/algo'
cd ~/projects/algo
? To pomysł!