Jak używać poleceń pushd i popd?

Jakie są praktyczne zastosowania zarówno pushd, jak i popd kiedy użycie tych dwóch poleceń ma przewagę nad cd i cd -?

EDYTUJ : Szukam praktycznych przykładów użycia obu tych poleceń lub powodów, dla których należy przechowywać stos z katalogami (gdy masz uzupełnianie tabulatorami, cd -, aliasy do skracania cd .. itp.).

Odpowiedź

pushd , popd i dirs to elementy wbudowane powłoki, które pozwalają na manipulowanie stosem katalogów . Można tego użyć do zmiany katalogów, ale powrócić do katalogu, z którego przyszedłeś.

Na przykład

uruchom z następującymi katalogami:

$ pwd /home/saml/somedir $ ls dir1 dir2 dir3 

pushd to dir1

$ pushd dir1 ~/somedir/dir1 ~/somedir $ dirs ~/somedir/dir1 ~/somedir 

dirs potwierdza, że mamy teraz 2 katalogi na stosie. dir1 i oryginalny katalog, somedir. UWAGA: Nasz ” obecny ” to ~/somedir/dir1.

pushd to ../dir3 (ponieważ jesteśmy teraz w środku dir1)

$ pushd ../dir3 ~/somedir/dir3 ~/somedir/dir1 ~/somedir $ dirs ~/somedir/dir3 ~/somedir/dir1 ~/somedir $ pwd /home/saml/somedir/dir3 

dirs pokazuje, że mamy teraz w stosie 3 katalogi. dir3, dir1 i somedir. Zwróć uwagę na kierunek. Każdy nowy katalog jest dodawany po lewej stronie. Kiedy zaczynamy wyświetlać katalogi wyłączone, będą też „pochodzić z lewej strony”.

ręcznie zmień katalogi na ../dir2

$ cd ../dir2 $ pwd /home/saml/somedir/dir2 $ dirs ~/somedir/dir2 ~/somedir/dir1 ~/somedir 

Teraz zacznij wyświetlać katalogi

$ popd ~/somedir/dir1 ~/somedir $ pwd /home/saml/somedir/dir1 

Zauważ, że wróciliśmy do dir1.

Pop ponownie …

$ popd ~/somedir $ pwd /home/saml/somedir 

I wróciliśmy tam, gdzie zaczęliśmy, somedir.

Może się trochę zagmatwać, ale szef stac k to katalog, w którym „aktualnie przebywasz. Dlatego kiedy wrócimy do somedir, mimo że dirs pokazuje to:

$ dirs ~/somedir 

Nasz stos jest w rzeczywistości pusty.

$ popd bash: popd: directory stack empty 

Komentarze

  • Dziękuję, całkowicie rozumiem pojęcie stosu i sposób działania tego polecenia. Jednak ' szukam praktycznych powodów, dla których warto przechowywać stos z katalogami (jeśli masz uzupełnianie tabulatorów, cd -, aliasy do skracania cd .. itp.).
  • Często używam pushd & popd w skryptach b / c oszczędzają mi konieczności pamiętania, skąd pochodzę, zawsze mogę po prostu popd, aby wrócić z gdzie przyszedłem. Zwykle robię popd >/dev/null 2>&1, aby wyciszyć. Używam cd- codziennie w mojej powłoce. W tym artykule znajdują się również inne wskazówki dotyczące oszczędzania czasu: thegeekstuff.com/2008/10/… .
  • @Garrett – nic, co mogę sobie wyobrazić.
  • @Garrett @slm, ponieważ cd - śledzi tylko ostatni katalog, wyobrażam sobie, że można mieć problemy, jeśli wywołasz funkcję, która również wewnętrznie zmienia katalog. w takim przypadku funkcja zakończyłaby się resetowaniem – do bieżącego katalogu, a nie katalogu, do którego chcesz wrócić. pushd / popd to najbezpieczniejsza metoda. Uwaga: nie ' nie przetestowałem swojej teorii.
  • Dlaczego nie wrócić do ~/somedir/dir3 po pierwszym popd?

Odpowiedź

Jest naprawdę przydatny przypadek użycia dla poleceń pushd i popd do jednoczesnej pracy z kilkoma folderami.

Możesz bardzo łatwo poruszać się po stosie, ponieważ jest on wyliczony. Oznacza to, że podczas pracy możesz mieć do dyspozycji kilka folderów roboczych.

Zobacz prosty przykład poniżej.


Najpierw utwórzmy przykładową strukturę folderów.

 user@vb:~$ mkdir navigate user@vb:~/navigate$ mkdir dir1 user@vb:~/navigate$ mkdir dir2 user@vb:~/navigate$ mkdir dir3 

Następnie możesz dodać wszystkie swoje foldery do stosu :

 user@vb:~/navigate$ pushd dir1/ ~/navigate/dir1 ~/navigate user@vb:~/navigate/dir1$ pushd ../dir2/ ~/navigate/dir2 ~/navigate/dir1 ~/navigate user@vb:~/navigate/dir2$ pushd ../dir3/ ~/navigate/dir3 ~/navigate/dir2 ~/navigate/dir1 ~/navigate 

Możesz to sprawdzić:

 user@vb:~/navigate/dir3$ dirs -v 0 ~/navigate/dir3 1 ~/navigate/dir2 2 ~/navigate/dir1 3 ~/navigate 

Aby bezpiecznie nawigować, musisz dwukrotnie dodać ostatni (zerowy) folder, ponieważ będzie on zawsze przepisywany:

 user@vb:~/navigate/dir3$ pushd . user@vb:~/navigate/dir3$ dirs -v 0 ~/navigate/dir3 1 ~/navigate/dir3 2 ~/navigate/dir2 3 ~/navigate/dir1 4 ~/navigate 

Teraz możesz przeskakiwać po tych folderach i pracować z stos jak z aliasami dla folderów.Wydaje mi się, że poniższa część nie wymaga objaśnień:

 user@vb:~/navigate/dir3$ cd ~4 user@vb:~/navigate$ dirs -v 0 ~/navigate 1 ~/navigate/dir3 2 ~/navigate/dir2 3 ~/navigate/dir1 4 ~/navigate user@vb:~/navigate$ cd ~3 user@vb:~/navigate/dir1$ dirs -v 0 ~/navigate/dir1 1 ~/navigate/dir3 2 ~/navigate/dir2 3 ~/navigate/dir1 4 ~/navigate user@vb:~/navigate/dir1$ touch text.txt user@vb:~/navigate/dir1$ cp text.txt ~2 user@vb:~/navigate/dir1$ ls ~2 text.txt user@vb:~/navigate/dir1$ dirs -v 0 ~/navigate/dir1 1 ~/navigate/dir3 2 ~/navigate/dir2 3 ~/navigate/dir1 4 ~/navigate 

Dodatkowa wskazówka to utworzenie aliasu dla dirs -v.

Na przykład:

# In ~/.bashrc alias dirs="dirs -v" 

Komentarze

  • I możesz wyczyścić stos, dirs -c
  • +1 dla faktycznie podając kilka praktycznych przykładów. ' łatwo jest zobaczyć, co robi pushd / popd ze strony podręcznika, ale dirs i cd ~ # nie są na początku oczywiste.
  • możesz także użyć zamiast tego rozwiązanie takie jak fasd dla tego rodzaju przepływu pracy, chociaż
  • @Jun, istnieje ' s ” mkdir dir {1,2,3} „, aby utworzyć 3 katalogi za jednym razem.
  • @JunMurakami to był mój rok! Szczęśliwego roku 2020!

Odpowiedź

Jednym prostym przypadkiem użycia stosu dirs jest to, czego nie można zrobić po prostu cd :

pushd . dodaje bieżący katalog XX do dirs stosu. Następnie możesz poruszać się za pomocą cd, a aby wrócić do XX, po prostu wykonaj popd niezależnie od tego, jak daleko jesteś drzewo katalogów (można przeskakiwać przez wiele poziomów, na boki itp.). Szczególnie przydatne w skryptach basha.

Komentarze

  • Myślę, że jest to funkcja, z której korzystam najczęściej. Ponieważ pushd / popd działają niezależnie od cd, możesz ich używać jako bardziej stabilnego zakładka niż cd -.
  • dla mnie to nieprawda. Za każdym razem, gdy używam cd, mój stos się zmienia.
  • och to było ze względu na używanie zsh, kiedy zmieniam na bash, działa dobrze.
  • To jedyna merytoryczna odpowiedź, jeśli chodzi o porównanie z cd -, IMO. Co do tego, czy pushd foo; < losowa zmiana katalogu >; popd jest bardziej wartościowy niż a = foo; cd $ a; < losowa zmiana katalogu >; cd $ a … W przypadku skryptów widzę niewielką wygodę składniową w pierwszym (pushd), ale ogromną poprawę przejrzystości w drugim (zmienne [jawne]!). Wydaje mi się, że w przypadku sesji interaktywnej po prostu założyłbym, że hierarchia katalogów jest właściwie zorganizowana, a jeśli się zgubię, po prostu cd ~ / z powrotem / do / oczywiste / ścieżka. ' czy nie ustawiono AUTO_PUSHD? Spowoduje to, że cd będzie zachowywał się jak pushd, usunie ustawienia i ' wrócisz do ” normalne zachowanie „.

Odpowiedź

pushd i popd pozwalają na manipulowanie katalogami na stosie.

Kiedy pushd katalog, umieszczasz bieżący katalog na stosie i zmieniasz katalog na określony jako parametr.

popd pozwoli ci wrócić do katalogu na stosie.

Jeśli powtórzysz, przemierzanie katalogów będzie w pewnym sensie zachowane i będziesz mógł wrócić do zapisanych katalogów w odwrotnej kolejności od tego, w którym je zapisałeś.

Odpowiedź

Dla bash , w zasadzie: zamiast używać cd, można użyj pushd, aby zmienić katalogi. Przy praktycznym zastosowaniu: historia odwiedzonych katalogów jest zapisywana (poprawnie: ułożona) i można się między nimi przełączać:

pushd /home; pushd /var; pushd log 

Aby zobaczyć stos użyj dirs i dla łatwiejszej nawigacji (aby uzyskać numery ” wpisów stosu „, użyj:

dirs -v 

Dane wyjściowe:

me@myhost:/home$ dirs -v 0 /home 1 /var 2 /tmp 

Teraz wykorzystaj te liczby z cd i ~ jak:

cd ~1 

Ale te liczby są teraz uporządkowane i pozycja ” 0 ” ulegnie zmianie, więc po prostu pushd katalog na najwyższą pozycję dwa razy (lub użyj atrapa na pozycji 0) na przykład:

me@myhost:/home$ dirs -v 0 /home 1 /home 2 /var 3 /tmp 

Teraz 1..3 zachowa swoją pozycję

(Aby zwolnić bieżący katalog z stos / usuwając go z historii, użyj popd)

Odpowiedz

Pushd / popd to taka prosta koncepcja, której zrozumienie zajęło mi trochę czasu, ponieważ ludzie mają tendencję do uczenia go, definiując te polecenia jako polecenia, które” manipulują stosem katalogów „, co moim zdaniem jest bardzo zagmatwane.

Patrzę na to inaczej:

pushd [nazwa_folderu] – przejdzie do [nazwa_folderu] i dokument miejsce docelowe, którym jest [nazwa_folderu] w stosie katalogów, podczas gdy katalog główny w stosie zawsze będzie bieżący katalog, w którym się znajdujesz

popd – najpierw cię do niego cd rekord katalogu, który znajduje się na szczycie stosu, a następnie usuń dokumentację (usuń ją ze stosu dir)

dirs – wydrukuje stos katalogów (może być traktowany jako katalog dir Db, w którym pozycja po lewej stronie jest bieżącym katalogiem (szczyt stosu)

A więc dwa najpopularniejsze przypadki użycia to:

Przykład zastosowania 1: Nawigacja za pomocą pushd i popd

root@mypc:/main/$ ls dir1 dir2 dir3 dir4 root@mypc:/main/$ dirs # prints the current stack /main root@mypc:/main/$ pushd dir1 # Will cd to dir1 and document dir1 in dir stack, stack is now: /main/dir1 /main root@mypc:/main/dir1$ # I am now in /main/dir1 root@mypc:/main/dir1$ # Now let"s go wild and document whatever I want root@mypc:/main/dir1$ pushd ../dir2 root@mypc:/main/dir2$ # Woo I am in /main/dir2 root@mypc:/main/dir2$ pushd ../dir3 root@mypc:/main/dir3$ # Woo I am in /main/dir3 root@mypc:/main/dir3$ pushd ../dir4 root@mypc:/main/dir4$ # Woo I am in /main/dir4 root@mypc:/main/dir4$ dirs # Now dir stack is: /main/dir4 /main/dir3 /main/dir2 /main/dir1 /main 

Powiedzmy Zrobiłem to powyżej, ponieważ chciałbym wrócić do tych folderów, które udokumentowałem!

Zauważ, że jeśli ręcznie wykonam cd, wpłynę na pozycję górnego stosu dir (który jest zawsze bieżącym katalogiem)

root@mypc:/main/dir4$ cd .. # Now dir stack is: # (note that /main appear in the leftmost as well which is the top of the stack) /main /main/dir3 /main/dir2 /main/dir1 /main root@mypc:/main$ 

Przejdźmy teraz wstecz:

root@mypc:/main$ popd root@mypc:/main$ # Still in /main since it was at the top of the dir stack root@mypc:/main$ dirs # Stack is now: /main/dir3 /main/dir2 /main/dir1 /main root@mypc:/main$ popd root@mypc:/main/dir3$ popd # Woo in dir3 now, about to navigate to dir2 root@mypc:/main/dir2$ popd # Woo in dir2, about to navigate to dir1 root@mypc:/main/dir1$ dirs # Stack is now: /main 

Ponownie mogę udokumentować dowolny katalog a następnie przejdź ręcznie do innego katalogu, wtedy będę mógł łatwo wrócić do udokumentowanego katalogu, który umieściłem na stosie.

Przykład zastosowania 2: Nawigacja przy użyciu numerycznego indeksu stosu

Powiedzmy, że pchnąłem używając pushd dir4 dir3 dir2 dir1, teraz uruchomienie dir -v pokaże:

root@mypc:/main$ dirs -v 0 /main/dir1 (this is the current dir you are in always) 1 /main/dir2 2 /main/dir3 3 /main/dir4 

Teraz możesz wykonać dowolną operację Linuksa, która obejmuje katalogi korzystające z indeksu stosu:

root@mypc:/main$ cp ~2/temp.txt ~3/new_temp.txt # this will run in the background, something like: # cp /main/dir2/temp.txt /main/dir3/new_temp.txt 

Możesz nawet usunąć konkretną wpis ze stosu dir:

root@mypc:/main$ popd ~4 

Mam nadzieję, że używając słów „dokumentowanie” lub pomyśl o stosie dir, ponieważ jakiś rodzaj Db upraszcza koncepcja!

Odpowiedź

Mówiąc najprościej – gdy potrzebujesz nawigować między więcej niż 2 katalogami, zwykle kilka razy wstecz & dalej, ponieważ cd - po prostu nie „nie wycina niczego poza dwoma folderami”.

Na przykład zamiast próbować ponownie wymyślać poprzednie długie ścieżki, patrząc na historię bufora lub wypełniając długą ścieżkę w zakładce, po prostu układasz ważne z nich w stos i w razie potrzeby wygodnie przechodzisz do nich tylko według ich liczby. Przechodzenie między złożonymi strukturami katalogów i długimi ścieżkami staje się płynne i szybkie.

Wbudowane funkcje pozwalają również na zmianę kolejności stosu lub wyskakiwanie katalogów, których już nie potrzebujesz, umożliwiając elastyczność w przepływie pracy.

Układanie katalogów może być również używane w skryptach w podobny sposób do operacji obejmujących kilka katalogów.

Odpowiedź

I uznałam, że użycie dirs / popd / pushd jest trochę niewygodne. Wymyśliłem własne rozwiązanie w tcsh, dodając następujący kod do .alias

 foreach b (. , - 0 1 2 3 4 5 6 7 8 9 ) alias p$b "set a=`pwd`; echo $a >! ~/.mydir"$b alias cd$b "cd "`cat ~/.mydir"$b"`"" alias del$b "rm -v ~/.mydir"$b alias home$b "set a="~"; echo $a >! ~/.mydir"$b end alias cdl "grep / ~/.mydir*" 

w ten sposób utworzyłem alias, na przykład „p.”, aby zapisać bieżący katalog roboczy do pliku ~ / .mydir. i „cd.”, aby odzyskać ten katalog w dowolnym miejscu i czasie. „del.” usuwa odpowiedni plik; „home.” ustawia katalog na katalog domowy (odpowiednik cd; p.); „cdl” wyświetla listę zapisanych katalogów. Pamiętaj, że jeśli używasz ~ / Dropbox / .mydir $ b (lub jakiejkolwiek innej usługi w chmurze, takiej jak np. ownCloud) zamiast ~ / .mydir $ b otrzymujesz sprytny sposób aby używać preferowanych katalogów na różnych kontach i komputerach.

Odpowiedź

Korzystanie z cd i cd - pozwala na przełączanie się tylko między dwoma ostatnio używanymi katalogami. Twój „zestaw roboczy katalogu” to dwa.

Używając pushd, możesz przechowywać dowolnie dużą liczbę katalogów w zestawie roboczym.

Przez większość czasu używam pushd, a nie cd. Po utworzeniu stosu aktywnych katalogów za pomocą pushd directory_name, możesz przeskakiwać między nimi przez cały dzień za pomocą pushd ~#.

pushd dir1 pushd ../dir2 pushd /full/path/to/dir3 # There are now three directories in the stack. pushd ~3 pushd ~2 # The same three directories are still on the stack, # just in a different order. 

Używam popd rzadko, tylko wtedy, gdy chcę usunąć katalog ze stosu, gdy wiem, że skończyłem używając tego katalogu.

Przejdź do katalogu i usuń go ze stosu:

popd ~2 

Pozostań w bieżącym katalogu i usuń inny katalog z stos:

popd +2 

Kończysz ze stylem pracy, który jest podobny do otwierania wielu okien terminala lub kart (po jednym na każdy katalog, w którym aktywnie działa), ale wszystko w jednym terminalu.Oszczędza to miejsce na ekranie, a ponadto, ponieważ wszystkie ścieżki katalogów są dostępne w jednej powłoce, możesz wykonać następujące czynności:

  • kopiować pliki między katalogami, z którymi aktualnie pracujesz
  • przeglądaj lub edytuj pliki w innym katalogu bez przechodzenia tam

Przykłady:

cp ~2/myfile.txt ~4 less ~2/myfile.txt 

W tcsh (ale nie bash), możesz nawet zapisać stos katalogów do pliku i przywrócić go później.

Zapisz:

dirs -S ~/dirstack 

Przywróć:

dirs -L ~/dirstack 

W przeciwnym razie po prostu zastąp ~ w bash przykładach z = do użytku w tcsh.

pushd =2 popd =4 popd +1 

Odpowiedź

Używam go w ten sposób w moim bash_profile i .bashrc w ten sposób

vi .bash_profile alias dirs="dirs -v" source d.sh :wq vi .bashrc alias dirs="dirs -v" :wq vi d.sh pushd ~/Documents/GIT/seiso-data pushd ~/Documents/GIT/ewe/EosRegistry pushd ~/Documents/GIT_LODGING/site-cookbooks pushd ~/Documents/CHEF_LODGING pushd . :wq 

to pomoc skaczę między katalogami do ostatnio używanych na moim terminalu. 🙂 Mam nadzieję, że pomoże ci to w użyciu pushd zamiast popd, używam cd ~ stackednumber

Dodaj komentarz

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