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ł!