Chcę uruchomić skrypt, aby po prostu zmienić bieżący katalog roboczy:
#!/bin/bash cd web/www/project
Ale po uruchomieniu bieżące pwd pozostaje niezmienione! Jak mogę to zrobić?
Odpowiedź
Jest to oczekiwane zachowanie. Skrypt jest uruchamiany w podpowłoce i nie może zmienić katalogu roboczego powłoki nadrzędnej. Jego efekty są tracone po zakończeniu.
Aby trwale zmienić katalog bieżącej powłoki, należy użyć polecenia source
, również aliasowanego po prostu jako .
, który uruchamia skrypt w bieżącym środowisku powłoki zamiast w powłoce dodatkowej.
Następujące polecenia są identyczne:
. script
lub
source script
Komentarze
Odpowiedź
W przypadku małych zadań, takich jak ten, zamiast tworzyć skrypt, utwórz alias podobny do tego,
$ alias cdproj="cd /dir/web/www/proj"
Dodaj go do swojego .bashrc
, jeśli chcesz go ustawić dla każdej powłoki interaktywnej.
Teraz możesz uruchomić to jako $ cdproj
.
Komentarze
- Możesz także ustawić w skrypcie echo poleceń do wykonania, a następnie użyć
eval `./script`
lubeval $(./script)
, aby wykonać te polecenia. Jest to typowe podejście dla poleceń, które muszą zaktualizować wywołujące środowisko powłoki ' s. - Po prostu bądź bardzo ostrożny z tym, co wypisujesz, jeśli masz zamiar przejść podejście
eval
.
Odpowiedź
Użyj exec bash
na końcu
Skrypt bash działa w swoim obecnym środowisku lub w środowisku jego dzieci, ale nigdy w swoim środowisko nadrzędne.
Jednak to pytanie jest często zadawane, ponieważ ktoś chce pozostać przy bash zachęta w określonym katalogu po wykonaniu skryptu bash z innego katalogu.
W takim przypadku po prostu wykonaj na końcu podrzędną instancję basha skryptu:
#!/usr/bin/env bash cd desired/directory exec bash
Tworzy nową podpowłokę. Wpisz Ctrl + D lub exit
, aby powrócić do pierwszej powłoki, w której skrypt został początkowo uruchomiony.
Aktualizacja
Przynajmniej w nowszych wersjach bash
exec
w ostatniej linii nie jest już wymagane. Ponadto skrypt można zmusić do pracy z dowolną preferowaną powłoką, używając zmiennej środowiskowej $SHELL
. W ten sposób otrzymujemy:
#!/usr/bin/env bash cd desired/directory $SHELL
Komentarze
- Lepiej jest po prostu pobrać skrypt, tak jak w zaakceptowanej odpowiedzi : używanie
exec
jest zwykle uważane za ostatnią deskę ratunku łajdaka .. 🙂 - ta sztuczka nie ' t pracować w Debianie 9.
- To jest zły sposób na zrobienie tego!
- Ponieważ nikt nie szczegółowo opisał problemów z tym (patrzę na ciebie, @Dennis): (1) Za każdym razem, gdy to uruchamiasz, tworzy nowy, trwały proces bash. Zrób to dziesięć lub dwadzieścia razy podczas jednej sesji, a będziesz mieć spiętrzonych od 11 do 21 procesów bash. Może to wpłynąć na wydajność, a jeśli spróbujesz zakończyć sesję, naciskając
exit
(lub Ctrl + D), będziesz musiał to zrobić od 11 do 21 razy. (2) Inną wadą używania wykonywalnego skryptu jest to, że jeśli ustawisz jakiekolwiek opcje powłoki (np.dotglob
lubglobstar
) w interaktywna sesja powłoki, stracisz je, ponieważ zaczynasz nową powłokę. - Bardzo fajne rozwiązanie! ' przepisałem mój alias w bash_profile, więc teraz jest to skrypt przechowywany w osobnym pliku. Używam skryptu, aby przejść do nowo utworzonego folderu tymczasowego. A teraz jeszcze łatwiej jest mieć tymczasową sesję bash. SRP w akcji! Dzięki!
Odpowiedź
Chociaż istnieją odpowiedzi, które wykonują dokładnie takie działania, jakie chcesz, bardziej standardowa metoda celem jest utworzenie dowiązania symbolicznego:
ln -s ~/web/www/project proj #use full path to dir!
Następnie możesz cd
do katalogu używając nazwy proj
:
cd proj
Ta metoda jest bardziej elastyczna, ponieważ można uzyskać dostęp do plików przy użyciu krótkiej nazwy bez cd
:
ls proj/ #note the endslash! vim proj/file.x
Odpowiedź
Zależy od tego, co „zamierzamy zrobić, innym rozwiązaniem może być utworzenie funkcji zamiast skryptu.
Przykład:
Utwórz funkcję w pliku, powiedzmy /home/aidin/my-cd-script
:
function my-cd() { cd /to/my/path }
Następnie umieść go w swoim bashrc
lub zshrc
plik:
# Somewhere in rc file source /home/aidin/my-cd-script
Teraz możesz go używać jak polecenia:
$ my-cd
Odpowiedź
Jeśli zmieniasz katalogi znajdujące się daleko w systemie plików. Polecę autojump .
Odpowiedź
Dla mnie najwygodniejszym i najbardziej elastycznym podejściem było połączenie aliasu i skryptu:
utwórz skrypt z dowolną logiką
Tutaj tworzę skrypt, który przechodzi do katalogu i aktywuje odpowiednie środowisko Pythona. Lokalizacja skryptów jest przykładowa w /path/to/workon_myproj.sh
.
#!/usr/bin/env bash cd $HOME/workspace/myproj source .venv/bin/activate
utwórz alias, który będzie źródłem skryptu
alias workon_myproj="source /path/to/workon_myproj.sh"
Dodaj definicję aliasu do odpowiedniego pliku startowego powłoki, np. .profile
, .bashrc
lub .zshrc
.
wynik
Możesz teraz po prostu wykonać workon_myproj
w powłoce, która pobierze zawartość twojego skryptu w wybranym katalogu.
rozszerzalność
Możesz ulepszyć swój skrypt, aby przyjmował argument, tak aby działał z wieloma projektami w określonym katalogu roboczym, lub połączyć go z git pull
, aby natychmiast uzyskać najnowsze zmiany i tak na … wszystko, co robisz, kontynuując pracę nad konkretnym projektem.
Odpowiedź
Dlaczego nie użyć ” exec „wydaje się robić dokładnie to, co chcę.
#!/bin/bash cd someplace exec bash ~/someplace
Komentarze
- Uważaj na rzeczy, wydaje się tym, czego chcesz. (Gigantyczny drewniany koń! Właśnie tego chciałem!) Za każdym razem, gdy to uruchamiasz, tworzy nowy, trwały proces bash. Zrób to dziesięć lub dwadzieścia razy podczas jednej sesji, a będziesz mieć zebranych od 11 do 21 procesów bash. Może to wpłynąć na wydajność, a jeśli spróbujesz zakończyć sesję w sposób czysty, naciskając
exit
(lub Ctrl + D), będziesz musiał to zrobić od 11 do 21 razy. - Zdecydowanie mogłem zobaczyć, gdzie to może być problem. Dla mnie jednak ' używam go jeden raz, wykonuję potrzebną pracę, a następnie wychodzę. Jeśli to ' jest jedyną wadą, to z tym żyć. Z drugiej strony, jeśli istnieje lepsze rozwiązanie, ' chcę się temu przyjrzeć.
- Odpowiedź Aidina na to pytanie za pomocą funkcji powłoki i odpowiedź Sachina Divekara , używając aliasu, są lepszymi rozwiązaniami (IMO) niż użycie skryptu . P.S. Inną wadą używania skryptu jest to, że jeśli ustawisz jakiekolwiek opcje powłoki (np.
dotglob
lubglobstar
), stracisz je, ponieważ zaczynasz nową powłokę. … (Ciąg dalszy) - (ciąg dalszy)… P.P.S. Właśnie zauważyłem, że w zasadzie powtarzasz odpowiedź Sergea Stroobandta i mówisz „Dlaczego tego nie zrobić?” W Wymiana stosów spodziewamy się, że odpowiedzi dostarczą nowych pomysłów i / lub informacji, a nie tylko omówią inne odpowiedzi.
Odpowiedź
To łączy odpowiedź Sergea z niezwiązaną odpowiedzią Davida . Zmienia katalog, a następnie zamiast wymuszać powłokę bash, uruchamia domyślną powłokę użytkownika . Wymaga to jednak zarówno getent
, jak i /etc/passwd
, aby wykryć domyślną powłokę.
#!/usr/bin/env bash cd desired/directory USER_SHELL=$(getent passwd <USER> | cut -d : -f 7) $USER_SHELL
Oczywiście nadal ma to ten sam problem, co tworzenie powłoki zagnieżdżonej.
Odpowiedź
Możesz to zrobić używając funkcji lub używając & & Poniższe przykłady instalują Zabbix i tworzą plik z linią w środku.
Np .:
#!/bin/bash # Create Function: installZabbix(){ cd /usr/src/zabbix-4.2.4; ./configure --enable-agent; make install; cd /usr/src/; >file; echo "Hi, this is a file." >>file; } # Call the function: installZabbix
lub:
#!/bin/bash cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
, aby uciec od skryptu pozyskanego w ten sposób, a nieexit
– są one jak funkcje powłoki iexit
zamknie powłokę, z której pochodzi skrypt.source ./script
to to samo?.
isource
są równe w bash. 2. Nie ' t trzeba użyć./
przed nazwą pliku, jeśli znajduje się on ' w tym samym katalogu. Można uruchomić tylko to:. script