Próbuję napisać mały skrypt, aby zmienić bieżący katalog na katalog projektu:
#!/bin/bash
cd /home/tree/projects/java
Zapisałem ten plik jako proj, dodałem uprawnienia do wykonywania chmod
i skopiowałem go do /usr/bin
. Kiedy nazywam to:
proj
nic nie robi. Co ja robię źle?
pwd
na ostatniej linii. Więc przed zakończeniem skryptu możesz sprawdzić, czy działa, czy nie ...cd
polecenie działa dobrze w skryptach, spróbuj sam.cd
znajduje?Odpowiedzi:
Skrypty powłoki są uruchamiane w podpowłoce, a każda podpowłoka ma własną koncepcję tego, czym jest bieżący katalog.
cd
Powiedzie, ale jak najszybciej wyjść podpowłoki, jesteś z powrotem w interaktywnej powłoki i nigdy nic się nie zmieniło.Jednym ze sposobów obejścia tego problemu jest użycie aliasu:
źródło
. my-script
lubsource my-script
.Nie robisz nic złego! Zmieniłeś katalog, ale tylko w podpowłoce, która uruchamia skrypt.
Możesz uruchomić skrypt w bieżącym procesie za pomocą polecenia „kropka”:
Ale wolałbym sugestię Grega, by w tym prostym przypadku użyć aliasu.
źródło
.
jest również pisanesource
, wybierz cokolwiek, co uważasz za bardziej niezapomniane.W
cd
skrypcie technicznie działało, ponieważ zmieniło katalog powłoki, która go uruchomiła, ale był to proces oddzielny od powłoki interaktywnej.Kompatybilnym z Posix sposobem rozwiązania tego problemu jest zdefiniowanie procedury powłoki zamiast skryptu poleceń wywoływanego przez powłokę .
Możesz to po prostu wpisać lub umieścić w jednym z różnych plików startowych powłoki.
źródło
jhome(){ cd /home/tree/projects/$1; }
cd
Odbywa się wewnątrz skorupy skryptu. Po zakończeniu skryptu powłoka kończy działanie, a następnie zostajesz w katalogu, w którym byłeś. „Źródło” skryptu, nie uruchamiaj go. Zamiast:zrobić
(Zwróć uwagę na kropkę i spację przed nazwą skryptu).
źródło
source
myscript.sh
znajduje się w katalogu zawartym w $ PATH, możesz go pobrać z dowolnego miejsca bez podawania pełnej ścieżki.Aby utworzyć skrypt bash, który będzie cd do wybranego katalogu:
Utwórz plik skryptu
Następnie utwórz alias w pliku startowym.
Na przykład utwórz główny plik aliasów / funkcji: /scripts/mastercode.sh
(Umieść alias w tym pliku).
Następnie na końcu pliku .bashrc :
Teraz łatwo jest cd do katalogu java, wystarczy wpisać cdjava i już tam jesteś.
źródło
mastercode.sh
nie potrzebuje shabang (#!/bin/sh
), ponieważ nie jest (i nie może być) wykonany w podpowłoce. Ale jednocześnie musisz udokumentować „smak” powłoki tego pliku; np. ksh lub bash (lub (t) csh / zsh, itp.) i prawie na pewno nie jest tak naprawdęsh
. Zazwyczaj dodaję komentarz (ale nie shebang), aby to przekazać; np. „ten plik ma być pozyskiwany (z bash), a nie uruchamiany jako skrypt powłoki”.source
d (przezalias
), zmienne te wyciekną do twojego środowiska powłoki. Aby tego uniknąć, wykonaj całą pracę skryptu w funkcji i po prostu wywołaj go na końcu skryptu. W ramach funkcji zadeklaruj dowolne zmiennelocal
.Możesz użyć
.
do wykonania skryptu w bieżącym środowisku powłoki:lub alternatywnie, jego bardziej czytelny, ale specyficzny dla powłoki alias
source
:Pozwala to uniknąć podpowłoki i pozwala, aby wszelkie zmienne lub wbudowane (w tym
cd
) wpływały na bieżącą powłokę.źródło
Pomysł Jeremy'ego Ruten'a na użycie dowiązania symbolicznego wywołał myśl, która nie przeszła żadnej innej odpowiedzi. Posługiwać się:
Wiodący dwukropek jest ważny; oznacza to, że jeśli w bieżącym katalogu znajduje się katalog „dir”, wówczas „
cd dir
” zmieni się na to, zamiast skakać gdzie indziej. Przy ustawionej wartości, jak pokazano, możesz:a jeśli w bieżącym katalogu nie ma podkatalogu o nazwie java, to zabierze Cię bezpośrednio do $ HOME / projects / java - bez aliasów, bez skryptów, bez wątpliwych poleceń ani poleceń dot.
Mój $ HOME to / Users / jleffler; mój $ CDPATH to:
źródło
Użyj
exec bash
na końcuJednak to pytanie jest często zadawane, ponieważ chce się pozostawić (nowy) monit bash w pewnym katalogu po wykonaniu skryptu bash z innego katalogu.
W takim przypadku po prostu uruchom podrzędną instancję bash na końcu skryptu:
źródło
exit
powrócisz do powłoki, w której uruchomiłeś ten skrypt.Mam kod do pracy za pomocą
. <your file name>
./<your file name>
dawka nie działa, ponieważ nie zmienia katalogu w terminalu, po prostu zmienia katalog specyficzny dla tego skryptu.Oto mój program
Oto mój terminal
źródło
. something
i./something
?? Ta odpowiedź zadziałała dla mnie i nie rozumiem dlaczego.. something
pozwala na uruchomienie skryptu z dowolnej lokalizacji,./something
wymaga przebywania w katalogu, w którym plik jest przechowywany.#!. /bin/bash
?po prostu uruchom:
źródło
Po uruchomieniu skryptu powłoki jest uruchamiane nowe wystąpienie tej powłoki (
/bin/bash
). W ten sposób skrypt po prostu odpala powłokę, zmienia katalog i kończy działanie. Innymi słowy,cd
(i inne takie polecenia) w skrypcie powłoki nie wpływają ani nie mają dostępu do powłoki, z której zostały uruchomione.źródło
W moim konkretnym przypadku potrzebowałem zbyt wiele razy, aby zmienić ten sam katalog. Więc na moim .bashrc (używam ubuntu) dodałem
1 -
2-
3 -
Bezpośrednio zrobi to: cd / home / tree / projects / java
Mam nadzieję, że to pomaga!
źródło
Możesz wykonać następujące czynności:
EDYCJA: Można to również „kropkować”, aby zapobiec tworzeniu kolejnych powłok.
Przykład:
źródło
exit
(lub ctrl + d) kilka razy opuścić powłokę, na przykład .. Alias jest o wiele bardziej przejrzysty (nawet jeśli polecenie powłoki wyświetla katalog, a cd do wyniku - alias coś = "cdgetnewdirectory.sh
")Zmienia tylko katalog samego skryptu, podczas gdy bieżący katalog pozostaje taki sam.
Zamiast tego możesz użyć łącza symbolicznego . Umożliwia utworzenie „skrótu” do pliku lub katalogu, więc wystarczy wpisać tylko coś takiego
cd my-project
.źródło
Możesz łączyć pseudonimy i kropki Adama i Grega, aby stworzyć coś bardziej dynamicznego -
Teraz uruchomiony alias projektu wykona skrypt projektu w bieżącej powłoce, w przeciwieństwie do podpowłoki.
źródło
Możesz połączyć alias i skrypt,
pod warunkiem, że skrypt echa ścieżki docelowej. Zauważ, że są to backty otaczające nazwę skryptu.
Na przykład skrypt może być
Zaletą tej techniki jest to, że skrypt może przyjmować dowolną liczbę parametrów wiersza poleceń i emitować różne miejsca docelowe obliczone na podstawie możliwie złożonej logiki.
źródło
proj() { cd "/home/user/projects/java/$1"; }
=>proj "foo"
(lub,proj "foo bar"
<= jeśli masz spacje) ... lub nawet (na przykład):proj() { cd "/home/user/projects/java/$1"; shift; for d; do cd "$d"; done; }
=>proj a b c
=> robicd
w/home/user/projects/java/a/b/c
do szybkiego przeglądania katalogów dostępne są $ CDPATH, cdargs i sposoby automatycznego generowania aliasów
http://jackndempsey.blogspot.com/2008/07/cdargs.html
http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5827311.html
źródło
W twoim pliku ~ / .bash_profile. dodaj następną funkcję
Zrestartuj terminal i możesz pisać
i zostaniesz przeniesiony do folderu docelowego.
źródło
Możesz użyć operatora &&:
cd myDirectory && ls
źródło
&&
jeśli chcesz, aby drugi był zależny od pierwszego, albo po prostu za pomocą;
lub nowego wiersza między nimi), ale umieszczenie tego w skrypcie spowoduje powrót do „dlaczego powłoka nadrzędna nie używa nowy katalog, kiedycd
faktycznie się powiódł? ”Podczas gdy pozyskiwanie skryptu, który chcesz uruchomić, jest jednym z rozwiązań, powinieneś być świadomy, że ten skrypt może następnie bezpośrednio modyfikować środowisko twojej bieżącej powłoki. Ponadto nie można już przekazywać argumentów.
Innym sposobem jest zaimplementowanie skryptu jako funkcji w bash.
Ta technika jest używana przez autojump: http://github.com/joelthelion/autojump/wiki, aby zapewnić ci naukę zakładek do katalogu powłoki.
źródło
Możesz utworzyć funkcję podobną do poniższej w swoim,
.bash_profile
która będzie działać płynnie.Poniższa funkcja przyjmuje opcjonalny parametr, którym jest projekt. Na przykład możesz po prostu uruchomić
lub
Oto definicja funkcji.
Nie zapomnij o swoim źródle
.bash_profile
źródło
To powinno zrobić, co chcesz. Przejdź do katalogu zainteresowań (z poziomu skryptu), a następnie spawnuj nową powłokę bash.
Jeśli uruchomisz to, zabierze Cię do interesującego katalogu, a gdy go opuścisz, przeniesie Cię z powrotem do pierwotnego miejsca.
Spowoduje to nawet powrót do oryginalnego katalogu po wyjściu ( CTRL+ d)
źródło
SPOJRZENIE Po pewnym czasie, ale zrobiłem następujące:
utwórz plik o nazwie case
wklej następujące pliki:
zapisz to, a następnie:
Utworzyłem również alias w moim
.bashrc
:teraz kiedy piszę:
zasadniczo piszę:
Możesz wpisać dowolny folder po „case”:
co jest jak pisanie:
odpowiednio
W moim przypadku ścieżka jest znacznie dłuższa - ci goście podsumowali ją wcześniej ~ info.
źródło
cd
W aliasu jest zbędny i nieeleganckie; alias powinien po prostu „. Zamiast tego ~ / case`. Równieżcase
jest zarezerwowanym słów kluczowych, więc to raczej kiepski wybór dla nazwiska.Nie potrzebujesz skryptu, ustaw tylko poprawną opcję i utwórz zmienną środowiskową.
W twojej
~/.bashrc
pozwalacd
na zawartość zmiennych środowiskowych.Utwórz taką zmienną środowiskową:
i możesz użyć:
Inne alternatywy .
źródło
Jeśli używasz ryb jako skorupy, najlepszym rozwiązaniem jest utworzenie funkcji. Jako przykład, biorąc pod uwagę oryginalne pytanie, możesz skopiować 4 poniższe wiersze i wkleić je do wiersza polecenia ryby:
Spowoduje to utworzenie funkcji i zapisanie jej do późniejszego użycia. Jeśli Twój projekt się zmieni, po prostu powtórz proces, używając nowej ścieżki.
Jeśli wolisz, możesz ręcznie dodać plik funkcji, wykonując następujące czynności:
i wprowadź tekst:
i na koniec naciśnij ctrl + x, aby wyjść, a następnie y powróć, aby zapisać zmiany.
( UWAGA: pierwsza metoda użycia funcsave tworzy dla Ciebie plik proj.fish ).
źródło
Mam prosty skrypt bash o nazwie p, aby zarządzać zmianą katalogu na
github.com/godzilla/bash-stuff,
po prostu włóż skrypt do lokalnego katalogu bin (/ usr / local / bin)
i umieść
w twoim .bashrc
źródło
Uwaga na dyskusję Jak ustawić katalog roboczy procesu nadrzędnego?
Zawiera kilka hackerskich odpowiedzi, np. Https://stackoverflow.com/a/2375174/755804 (zmiana katalogu procesów nadrzędnych przez gdb, nie rób tego) i https://stackoverflow.com/a/51985735/755804 ( polecenie,
tailcd
które wstrzykuje cd dirname do strumienia wejściowego procesu nadrzędnego; idealnie, powinno być częścią basha zamiast hacka)źródło
To stare pytanie, ale jestem naprawdę zaskoczony, że nie widzę tutaj tej sztuczki
Zamiast używać cd możesz użyć
Nie trzeba tworzyć podpowłoki ani używać aliasów.
Pamiętaj, że Twoim obowiązkiem jest upewnić się, że / path / you / want istnieje.
źródło
Jak wyjaśniono w innych odpowiedziach, zmieniłeś katalog, ale tylko w podpowłoce, która uruchamia skrypt . nie wpływa to na powłokę nadrzędną.
Jednym z rozwiązań jest użycie funkcji bash zamiast skryptu bash (
sh
); poprzez umieszczenie kodu skryptu bash w funkcji. Dzięki temu funkcja jest dostępna jako polecenie, a następnie zostanie wykonana bez procesu potomnego, a zatem każdecd
polecenie wpłynie na powłokę wywołującą.Funkcje Bash:
Jedną z funkcji profilu bash jest przechowywanie niestandardowych funkcji, które można uruchamiać w terminalu lub w skryptach bash w taki sam sposób, jak uruchamiasz aplikację / polecenia, może to również służyć jako skrót do długich poleceń.
Aby twoja funkcja była wydajna, musisz skopiować ją na końcu kilku plików
Możesz
sudo kwrite /home/user/.bashrc /home/user/.bash_profile /root/.bashrc /root/.bash_profile
szybko edytować / tworzyć te plikiJak :
Skopiuj kod skryptu bash do nowej funkcji na końcu pliku profilu bash i zrestartuj terminal, możesz następnie uruchomić
cdd
dowolną funkcję, którą napisałeś.Przykład skryptu
Tworzenie skrótu do za
cd ..
pomocącdd
skrót
skrót
źródło
Możesz wykonać niektóre linie w tej samej podpowłoce, jeśli zakończysz linie odwrotnym ukośnikiem.
źródło