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 skracaniacd ..
itp.). - Często używam
pushd
&popd
w skryptach b / c oszczędzają mi konieczności pamiętania, skąd pochodzę, zawsze mogę po prostupopd
, 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 pierwszympopd
?
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
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 odcd
, 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, żecd
będzie zachowywał się jakpushd
, 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
dirs -c