Chcę tylko napisać skrypt, który zmieni mój katalog .
Umieszczam poniższe polecenia w pliku /home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
Zrobiłem chmod +x pathABC
.
W terminalu, podczas gdy /home/alex
ja, uruchamiam ./pathABC
, ale dane wyjściowe są tylko HelloWorld
i bieżący katalog nie jest zmieniany.
Więc co jest nie tak?
command-line
scripts
gnome-terminal
Mohammad Reza Rezwani
źródło
źródło
Odpowiedzi:
Jak wyjaśnili inni, katalog jest zmieniany w procesie potomnym skryptu, a nie w procesie terminalowym, z którego skrypt jest wywoływany. Po śmierci procesu potomnego wracasz do terminala, który został tam, gdzie był.
Kilka alternatyw:
1. Link symboliczny
Umieść w swoim domu symboliczne łącze do długiej ścieżki, do której chcesz łatwo uzyskać dostęp
następnie przejdź do katalogu za pomocą:
2. Alias
Umieść alias w swoim ~ / .bashrc:
( stąd )
3. Funkcja
Utwórz funkcję, która zmienia katalog, funkcja działa w trakcie działania twojego terminala, a następnie może zmienić jego katalog.
( stąd )
4. Unikaj biegania jako dziecko
Źródło skryptu zamiast go uruchamiać. Sourcing (wykonywany przez
.
lubsource
) powoduje, że skrypt jest wykonywany w tej samej powłoce, a nie we własnej podpowłoce.( stąd i tutaj )
5. Vars z obsługą CD
Ustaw
cdable_vars
opcję w swoim~/.bashrc
i utwórz zmienną środowiskową do katalogu:Następnie możesz użyć
cd pathABC
( stąd )
źródło
source
! Zawsze zastanawiałem się, dlaczego tak robię,source .bashrc
a niebash .bashrc
cd $pathABC
?Po uruchomieniu skryptu w terminalu uruchamiany jest proces potomny. W tym programie potomnym, tj. Skrypt zmieni się na dowolny określony katalog. Ale w procesie nadrzędnym, tzn. Gdzie uruchamiasz skrypt, wciąż znajduje się on na starej ścieżce. LUB po prostu możemy powiedzieć:
The scope of cd command is only for child process not parent
źródło
. pathABC
albosource pathABC
.Popełniasz błąd myślenia. Podczas gdy bieżąca powłoka pozostaje w tym samym katalogu, skrypt został przeniesiony do nowego katalogu.
Można to zobaczyć, tworząc inny skrypt w nowym katalogu i uruchamiając go ze skryptu po zmianie katalogu:
Drugi skrypt uruchomi się z nowego katalogu.
jest tylko wynikiem działania skryptu.
źródło
pwd
nowy katalog, zamiast dodawać całkiem nowy skrypt do sytuacji.Ponieważ hello world jest tylko instrukcją śledzenia, spróbujmy tego:
Utwórz plik skryptu bash
cd.sh
zawierający:.sh
Rozszerzenie jest starszy konwencja daje skrypt bash nazewnictwo rozszerzenie. Jest to czysto kosmetyczne i zwykle niepotrzebne. Jednak w tym przypadku ważne jest, aby odróżnić się od podstawowegocd
polecenia.Zaznacz plik wykonywalny skryptu bash, używając:
Teraz uruchom plik:
cd
wszyscy wiemy.$(...)
wykonuje polecenie w nawiasie i zwraca dane wyjściowe.cd.sh
był na twojej ścieżce, nie musisz określać, gdzie to jest. Używamy przedrostka,./
aby określić, że polecenie znajduje się w bieżącym katalogu.echo
wyjściowecd.sh
skryptu są przesyłane z powrotem do rodzica za pośrednictwem$(...)
. Nadrzędny (nasz monit powłoki) korzysta z tych danych wyjściowych i przekazuje je docd
komendy Linux .Jak wspomnieli inni, proces potomny nie może zmienić katalogu rodzica. Jest to jeden ze sposobów, w jaki dziecko może powiedzieć rodzicowi, gdzie ma się udać po zakończeniu procesu.
źródło
14.04
wersję przeczytałem około godzinę temu?cd /home/mike/Documents/A/B/C
które nie dawało żadnych wyników. Teraz jestecho "/home/mike/Documents/A/B/C"
, co daje wynik../cd.sh
jest teraz,cd $(./cd.sh)
ale osiąga cel, jakim jest zmiana przez dziecko bieżącego katalogu nadrzędnego. Tak, to niekonwencjonalne, ale mam nadzieję, że ludzie uznają to za inny sposób.