Skrypt do zmiany bieżącego katalogu (cd, pwd)

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

  • @Sony: Pamiętaj, że powinieneś używać return, aby uciec od skryptu pozyskanego w ten sposób, a nie exit – są one jak funkcje powłoki i exit zamknie powłokę, z której pochodzi skrypt.
  • @CharlesStewart W rzeczywistości ' nie znam skryptów źródłowych. Dziękuję!
  • czy source ./script to to samo?
  • @amyassin: tak, to jest
  • 1. . i source 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

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` lub eval $(./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 lub globstar) 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 lub globstar), 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 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *