Cum folosesc comenzile pushd și popd?

Care sunt utilizările practice atât ale pushd, cât și ale popd atunci când există un avantaj al utilizării acestor două comenzi peste cd și cd -?

EDIT : Caut câteva exemple practice de utilizări pentru ambele comenzi sau motive pentru păstrarea stivei cu directoarele (când ați completat fila, cd -, pseudonime pentru scurtarea cd .. etc.).

Răspuns

pushd , popd și dirs sunt shell builtins care vă permit să manipulați stiva de directoare . Aceasta poate fi utilizată pentru a schimba directoare, dar pentru a reveni la directorul din care ați venit.

De exemplu

pornește cu următoarele directoare:

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

pushd to dir1

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

dirs confirmă că avem acum 2 directoare în stivă. dir1 și dir original, somedir. NOTĂ: ” curent ” este ~/somedir/dir1.

pushd to ../dir3 (pentru că „ne aflăm în dir1 acum)

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

dirs arată că avem acum 3 directoare în stivă. dir3, dir1 și somedir. Observați direcția. Fiecare director nou este adăugat în stânga. Când începem să apară directoare oprit, vor veni și din stânga.

schimbă manual directoare în ../dir2

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

Acum începeți să deschideți directoare

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

Observați că am revenit la dir1.

Pop din nou …

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

Și ne întoarcem de unde am început, somedir.

S-ar putea să devină puțin confuz, dar capul stac k este directorul în care vă aflați în prezent. Prin urmare, când revenim la somedir, chiar dacă dirs arată acest lucru:

$ dirs ~/somedir 

Stiva noastră este de fapt goală.

$ popd bash: popd: directory stack empty 

Comentarii

  • Mulțumesc, înțeleg total conceptul de stivă și cum funcționează aceste comenzi. Cu toate acestea, ‘ caut câteva motive practice pentru păstrarea stivei cu directoarele (când aveți completarea filelor, cd -, aliasuri pentru scurtare cd .. etc.).
  • De multe ori folosesc pushd & popd în scripturile b / c mă scutesc de faptul că trebuie să-mi amintesc de unde veneam, pot întotdeauna doar popd să revin de la unde am venit. De obicei, fac popd >/dev/null 2>&1 pentru a-l face silențios. Folosesc cd- în fiecare zi în shell. Există și alte sfaturi pentru economisirea timpului și în acest articol: thegeekstuff.com/2008/10/… .
  • @Garrett – niciunul pe care să-l pot concepe.
  • @Garrett @slm, deoarece cd - urmărește doar ultimul director, îmi imaginez că ar fi fi posibil să aveți probleme dacă apelați o funcție care schimbă și directorul intern. în acest caz, funcția ar ajunge să se reseteze – la directorul curent, nu la directorul în care doriți să reveniți. pushd / popd este cea mai sigură metodă. Notă: ‘ nu mi-am testat teoria.
  • De ce să nu revin la ~/somedir/dir3 după primul popd?

Răspuns

Există un caz de utilizare foarte util pentru pushd și popd comenzi pentru a lucra simultan cu mai multe foldere.

Puteți naviga în stivă foarte ușor, deoarece este enumerat. Adică, aveți la dispoziție mai multe foldere de lucru în timpul lucrului.

Vedeți un exemplu simplu mai jos.


Mai întâi, să creăm un exemplu de structură a folderelor.

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

Apoi puteți adăuga toate folderele în stivă :

 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 

Puteți căuta prin:

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

Pentru a naviga în siguranță, trebuie să adăugați ultimul (zero) folder de două ori, deoarece acesta va fi întotdeauna rescris:

 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 

Acum, puteți săriți prin aceste foldere și să lucrați cu stivă ca și cu aliasuri pentru foldere.Cred că următoarea parte se explică de la sine:

 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 

Sfat suplimentar este de a crea unele aliasuri pentru dirs -v.

De exemplu:

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

Comentarii

  • Și puteți șterge stiva cu dirs -c
  • +1 pentru dând de fapt câteva exemple practice. Este ‘ ușor de văzut ce fac pushd / popd din pagina de manual, dar dirs și cd ~ # nu sunt evidente la început.
  • ați putea folosi și o soluție precum fasd pentru acest tip de flux de lucru, deși
  • @Jun, există ‘ s ” mkdir dir {1,2,3} ” pentru a crea 3 directoare într-o singură fotografie.
  • @JunMurakami mi-a făcut anul! Fericit 2020!

Răspuns

Un caz de utilizare simplu pentru utilizarea stivei de directoare ceea ce nu puteți face doar prin cd este :

pushd . adaugă directorul XX actual la stiva dirs. După aceea, vă puteți deplasa folosind cd și pentru a reveni la XX, pur și simplu faceți popd indiferent de cât de „departe” vă aflați arborele directorului (poate sări peste mai multe niveluri, lateral, etc.). Util în special în scripturile bash.

Comentarii

  • Cred că aceasta este caracteristica de care profitez cel mai des. Deoarece pushd / popd funcționează independent de cd, le puteți folosi ca o soluție mai stabilă marcaj decât cd -.
  • pentru mine acest lucru nu este adevărat. De fiecare dată când folosesc cd-ul, stiva mea se schimbă.
  • oh, asta a fost cumva să folosesc zsh, când trec la bash, funcționează bine
  • Acesta este singurul răspuns de fond în ceea ce privește o comparație cu cd -, IMO. În ceea ce privește dacă pushd foo; < modificarea direcției aleatorii >; popd merită mai mult decât a = foo; cd $ a; < modificarea direcției aleatorii >; cd $ a … Pentru scripturi pot vedea o comoditate sintactică mică în prima (pushd), dar o îmbunătățire masivă a clarității în cea din urmă (variabile [explicite]!). Pentru o sesiune interactivă, cred că aș presupune că ierarhia mea de directoare ar fi organizată corect, în primul rând și dacă m-aș pierde pur și simplu cd ~ / back / to / evident / path.
  • @HarendraSingh tu nu ‘ s-a întâmplat să aibă setat AUTO_PUSHD? Acesta va face ca cd să se comporte ca pushd, să îl dezactivați și ‘ veți reveni la ” comportament normal „.

Răspuns

pushd și popd vă permit să manipulați directoarele din stivă.

Când pushd un director, puneți directorul curent în stivă și schimbați directorul cu cel specificat ca parametru.

popd vă va permite să reveniți la directorul din stivă.

Dacă repetați, traversarea directorului va fi conservată și puteți reveni la directoarele salvate în ordine inversă în ceea ce le-ați salvat.

Răspuns

Pentru bash , practic: în loc să folosiți cd se poate utilizați pushd pentru a schimba directoare. Cu utilizare practică: istoricul directoarelor vizitate este salvat (corect: stivuit) și se poate comuta între ele:

pushd /home; pushd /var; pushd log 

Pentru a vedea stiva utilizați dirs și pentru o navigare mai ușoară (pentru a obține numerele ” stiva-intrări ” utilizați:

dirs -v 

Ieșire:

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

Acum utilizați aceste numere cu cd și ~ precum:

cd ~1 

Dar aceste numere sunt rearanjate acum și poziția ” 0 ” se va schimba, deci doar pushd directorul în poziția superioară de două ori (sau utilizați un manechin pe poziția 0), cum ar fi:

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

Acum 1..3 își va păstra poziția

(Pentru a elibera directorul curent din stiva / ștergerea acestuia din istoric, utilizați popd)

Răspuns

Pushd / popd este un concept atât de simplu care m-a dus o vreme să îl înțeleg, deoarece oamenii au tendința de a-l învăța definind aceste comenzi ca comenzi care„ manipulează stiva de directoare ”, ceea ce, în opinia mea, este foarte confuz.

O privesc într-un mod diferit:

pushd [folder_name] – va cd către [folder_name] și va documenta destinația care este [folder_name] într-o stivă dir în timp ce directorul de sus în stivă va fi întotdeauna direcția curentă în care vă aflați

popd – vă va cd întâi în înregistrarea directorului care este deasupra stivei apoi și eliminați documentația (scoateți-o din stiva dir)

dirs – Va imprima stiva dir (poate fi tratată ca dir Db unde intrarea din stânga este directorul curent (partea de sus a stivei)

Deci, cele mai populare 2 cazuri de utilizare sunt:

Caz de utilizare 1: Navigarea utilizând 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 

Să spunem Am făcut cele de mai sus, deoarece aș dori să navighez înapoi la acele foldere pe care le-am documentat!

Rețineți că, dacă fac manual cd, voi afecta intrarea stivei de direcție de sus (care este întotdeauna direcția curentă)

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$ 

Să navigăm înapoi acum:

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 

Din nou pot documenta orice direcție vreau și apoi navigați manual către un alt director, apoi voi putea reveni cu ușurință la directorul documentat pe care l-am inserat în stivă.

Caz de utilizare 2: Navigarea utilizând indexul stivei numerice

Să spunem că am împins folosind pushd dir4 dir3 dir2 dir1 dir1, acum rulând dir -v va apărea:

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 

Acum puteți face orice operație Linux care implică directoare folosind indexul stivei:

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 

Puteți chiar șterge un anumit intrare din stiva dir:

root@mypc:/main$ popd ~4 

Sper că folosirea cuvintelor „documentare” sau gândirea la stiva dir ca un fel de Db simplifică conceptul!

Răspuns

Pur și simplu – când trebuie să navigați între mai mult de 2 directoare, de obicei de câteva ori înapoi & în continuare, deoarece cd - tocmai nu a fost tăiat cu nimic dincolo de 2 dosare.

Deci, de exemplu, în loc să încercați să reveniți cu căile lungi anterioare, uitându-vă la istoricul tamponului dvs. sau completând o cale lungă, pur și simplu le stivați pe cele importante și, dacă este necesar, vă deplasați convenabil la ele numai prin numărul lor. Rotirea între structurile de directoare complexe și căile lungi devine simplă și rapidă.

Încorporatele vă permit, de asemenea, să reordonați stiva sau să scoateți directoarele de care nu mai aveți nevoie, permițând flexibilitatea în fluxul de lucru.

Stivuirea directoarelor poate fi folosită și în scripturi în mod similar pentru operațiuni care acoperă mai multe directoare.

Răspuns

I Mi s-a părut puțin incomodă utilizarea dirs / popd / pushd. Am venit cu soluția mea personală în tcsh, adăugând următorul cod în .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*" 

în acest fel am aliasat, de exemplu, „p.” pentru a salva dir-ul de lucru curent în fișierul ~ / .mydir. și „cd.” pentru a recupera acel director oricând și oriunde îmi place. „del.” elimină fișierul corespunzător; „home.” setează dir-ul la dir-ul home (echivalent cu cd; p.); „cdl” listează care sunt dir-urile salvate. Rețineți că dacă utilizați ~ / Dropbox / .mydir $ b (sau orice alt serviciu cloud cum ar fi ex. ownCloud) în loc de ~ / .mydir $ b veți obține un mod inteligent pentru a utiliza direcțiile preferate în diferite conturi și mașini.

Răspuns

Utilizarea cd și cd - vă permite să comutați între cele mai recente două directoare utilizate. Dimensiunea „setului de lucru pentru director” este de două.

Folosind pushd, puteți păstra un număr arbitrar de mare de directoare în setul dvs. de lucru.

Folosesc pushd de cele mai multe ori, mai degrabă decât cd. Odată ce ați „construit un teanc de directoare active cu pushd directory_name, puteți sări între ele toată ziua cu 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. 

Folosesc rar popd rareori, numai când vreau să elimin un director din stivă când știu că am terminat folosind acel director.

Accesați directorul și scoateți-l din stivă:

popd ~2 

Rămâneți în directorul curent și eliminați un alt director din stivă:

popd +2 

Veți ajunge cu un stil de lucru asemănător cu deschiderea mai multor ferestre sau file deschise (una pentru fiecare director în care sunteți activ) funcționează), dar toate într-un singur terminal.Acest lucru salvează proprietățile imobiliare ale ecranului, plus, deoarece căile de directoare sunt disponibile într-un singur shell, puteți face lucruri precum:

  • copiați fișiere între directoarele cu care lucrați în prezent
  • vizualizați sau editați fișiere într-un alt director fără a merge acolo

Exemple:

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

În tcsh (dar nu bash), puteți chiar să salvați stiva de directoare într-un fișier și să o restaurați mai târziu.

Salvați:

dirs -S ~/dirstack 

Restaurare:

dirs -L ~/dirstack 

În caz contrar, înlocuiți doar ~ în bash exemple cu = pentru utilizare în tcsh.

pushd =2 popd =4 popd +1 

Răspuns

Îl folosesc astfel în bash_profile și .bashrc în acest fel

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 

vă ajută Sărut între directoare la cele mai recente utilizate pe terminalul meu. 🙂 Sper că te ajută să folosești mai degrabă pushd i folosesc cd ~ stackednumber

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *