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 scurtarecd ..
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 doarpopd
să revin de la unde am venit. De obicei, facpopd >/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ă primulpopd
?
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
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 decd
, le puteți folosi ca o soluție mai stabilă marcaj decâtcd -
. - 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 cacd
să se comporte capushd
, 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
dirs -c