Czy można zmienić bieżący katalog ze skryptu?
Chcę stworzyć narzędzie do nawigacji w katalogu w Bash. Utworzyłem skrypt testowy, który wygląda następująco:
#!/bin/bash
cd /home/artemb
Kiedy wykonuję skrypt z powłoki Bash, bieżący katalog się nie zmienia. Czy w ogóle można zmienić bieżący katalog powłoki ze skryptu?
bash
environment
artemb
źródło
źródło
pushd
(prawdopodobnie przekierowano, aby>/dev/null
ukryć jego dane wyjściowe) zamiastcd
, możesz później powrócić do poprzedniego katalogu za pomocąpopd
.Odpowiedzi:
Musisz przekonwertować skrypt na funkcję powłoki:
Powodem jest to, że każdy proces ma swój bieżący katalog, a po uruchomieniu programu z powłoki jest on uruchamiany w nowym procesie. Standardowe „cd”, „pushd” i „popd” są wbudowane w interpreter powłoki, aby miały wpływ na proces powłoki.
Ustawiając program jako funkcję powłoki, dodajesz własne polecenie w trakcie procesu, a następnie każda zmiana katalogu jest odzwierciedlana w procesie powłoki.
źródło
Po uruchomieniu skryptu tworzony jest nowy proces, który dziedziczy tylko środowisko. Kiedy się kończy, kończy się. Twoje obecne środowisko pozostaje takie, jakie jest.
Zamiast tego możesz uruchomić skrypt w następujący sposób:
.
Oceni skrypt w obecnej sytuacji, więc to może być zmienionaźródło
.sh
rozszerzenia są całkowicie eww. Nie używaj ich.W świetle nieczytelności i nadmiernej komplikacji odpowiedzi uważam, że to właśnie powinien zrobić wnioskodawca
PATH
. scriptname
.
(Kropka) będzie upewnić się, że skrypt nie jest prowadzony w powłoce dziecięcej.źródło
Łącząc powyższe, możesz utworzyć alias
jeśli nie chcesz pisać wiodącego „.” za każdym razem, gdy chcesz otrzymać skrypt w środowisku powłoki lub po prostu nie chcesz pamiętać, że należy to zrobić, aby skrypt działał poprawnie.
źródło
~/.bash_aliases
nie zawsze jest pozyskiwany podczas uruchamiania Bash.Jeśli używasz bash, możesz wypróbować alias:
w pliku .bashrc dodaj ten wiersz:
kiedy wpiszesz „p” w wierszu poleceń, zmieni katalog.
źródło
Jeśli uruchomisz skrypt bash, będzie on działał w bieżącym środowisku lub w środowisku swoich dzieci, nigdy na rodzicu.
Jeśli celem jest uruchomienie polecenia: goto.sh / home / test Następnie pracuj interaktywnie w / home / test jednym ze sposobów jest uruchomienie interaktywnej podpowłoki w skrypcie:
W ten sposób będziesz w / home / test, dopóki nie wyjdziesz (wyjście lub Ctrl + C) tej powłoki.
źródło
Dzięki pushd bieżący katalog jest wypychany na stos katalogów i jest zmieniany na podany katalog, popd umieszcza katalog na wierzchu stosu i przechodzi do niego.
źródło
Po prostu idź do
i dodaj ten kod obok ostatniego wiersza:
Następnie zamknij edytor.
Następnie wpisz:
teraz możesz użyć: twoje polecenie w terminalu
źródło
Stworzyłem skrypt do zmiany katalogu. spójrz: https://github.com/ygpark/dj
źródło
Zasadniczo używamy
cd..
do powrotu z każdego katalogu. Pomyślałem, aby to ułatwić, podając liczbę katalogów, z którymi musisz wracać naraz. Możesz to zaimplementować za pomocą osobnego pliku skryptu za pomocą polecenia alias. Na przykład:code.sh
Po użyciu
source code.sh
w bieżącej powłoce możesz użyć:wrócić dwa kroki od bieżącego katalogu. Szczegółowo wyjaśnione tutaj . Wyjaśniono tam również, jak umieścić kod w ~ / .bashrc, aby każda nowa otwarta powłoka automatycznie otrzymywała nowe polecenie aliasu. Możesz dodać nowe polecenie, aby przejść do określonych katalogów, modyfikując kod, dodając więcej
if conditions
i różne argumenty. Możesz także pobrać kod z git tutaj .źródło
To podejście jest dla mnie łatwiejsze.
Załóżmy, że na osobistym komputerze iMac, w którym jesteś administratorem, w domyślnym katalogu, gdy otwarte jest okno poleceń, / Users / jdoe, będzie to katalog, do którego można przejść: /Users/jdoe/Desktop/Mongo/db.3.2.1 /kosz.
Oto kroki, które można wykonać:
cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin
jako pierwszy wiersz.chmod 755 mongobin
source mongobin
pwd
Voila!
źródło
Stworzyłem również narzędzie o nazwie koza , którego można używać w celu ułatwienia nawigacji.
Możesz zobaczyć kod źródłowy na GitHub .
Począwszy od v2.3.1 z przeglądu użycie wygląda następująco:
źródło
Lubię robić to samo dla różnych projektów bez uruchamiania nowej powłoki.
W Twoim przypadku:
Zapisz skrypt jako:
Następnie uruchom go za pomocą:
Następnie przechodzisz do katalogu przy użyciu tej samej powłoki.
źródło
Dodaj poniżej linii cd w swoim shellscript to:
źródło
Zadeklaruj swoją ścieżkę:
źródło
Po prostu napisz
PWD
i wyeksportuj go do skryptu, a zmiana będzie się utrzymywać.źródło