Hvordan bruker jeg pushd- og popd-kommandoer?

Hva er den praktiske bruken av både pushd og popd når det er en fordel med å bruke disse to kommandoene over cd og cd -?

EDIT : Jeg ser etter noen praktiske eksempler på bruksområder for begge disse kommandoene eller grunner til å holde stabelen med kataloger (når du har fullført fane, cd -, aliaser for å forkorte cd .. osv.).

Svar

pushd , popd , og dirs er skallinnbygginger som lar deg manipulere katalogstakken . Dette kan brukes til å endre kataloger, men gå tilbake til katalogen du kom fra.

For eksempel

start opp med følgende kataloger:

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

pushd to dir1

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

dirs kommando bekrefter at vi har to kataloger på bunken nå. dir1 og den opprinnelige dir, somedir. MERK: Vår » nåværende » katalog er ~/somedir/dir1.

pushd til ../dir3 (fordi vi «er inne i dir1 nå)

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

dirs viser at vi har 3 kataloger i stabelen nå. dir3, dir1 og somedir. Legg merke til retningen. Hver nye katalog blir lagt til venstre. Når vi begynner å poppe kataloger av, de vil også komme fra venstre.

Endre kataloger manuelt til ../dir2

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

Start nå popping-kataloger

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

Legg merke til at vi kom tilbake til dir1.

Pop igjen …

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

Og vi er tilbake der vi startet, somedir.

Kan bli litt forvirrende, men hodet på stac k er katalogen du er i for øyeblikket. Derfor når vi kommer tilbake til somedir, selv om dirs viser dette:

$ dirs ~/somedir 

Stakken vår er faktisk tom.

$ popd bash: popd: directory stack empty 

Kommentarer

  • Takk, jeg forstår helt begrepet stack og hvordan denne kommandoen fungerer. Imidlertid ser jeg ‘ etter noen praktiske grunner til å holde stabelen med kataloger (når du har fullført fanen, cd -, aliaser for å forkorte cd .. osv.).
  • Jeg bruker ofte pushd & popd i skript b / c de redder meg fra å måtte huske hvor jeg kom fra, jeg kan alltid bare popd for å komme tilbake fra hvor jeg kom. Jeg pleier å gjøre popd >/dev/null 2>&1 for å gjøre det stille. Jeg bruker cd hver dag i skallet mitt. Det er noen andre tidsbesparende tips i denne artikkelen også: thegeekstuff.com/2008/10/… .
  • @Garrett – ingen som jeg kan bli gravid.
  • @Garrett @slm siden cd - bare sporer den siste katalogen, jeg forestiller meg at det ville være mulig å ha problemer hvis du ringer til en funksjon som også endrer katalog internt. i så fall vil funksjonen ende opp med å tilbakestilles – til din nåværende katalog, ikke katalogen du vil gå tilbake til. pushd / popd er den tryggeste metoden. Merk: jeg har ikke ‘ ikke testet teorien min.
  • Hvorfor ikke gå tilbake til ~/somedir/dir3 etter den første popd?

Svar

Det er et veldig nyttig brukstilfelle for pushd og popd kommandoer for å jobbe med flere mapper samtidig.

Du kan navigere i bunken veldig enkelt, siden den er oppført. Det vil si at du kan ha flere arbeidsmapper til din disposisjon under arbeidet.

Se et enkelt eksempel nedenfor.


La oss først lage eksempelmappestruktur.

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

Deretter kan du legge til alle mappene dine i stakken :

 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 

Du kan slå opp det ved å:

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

For å navigere trygt, du må legge til den siste (null) mappen to ganger, siden den alltid blir skrevet om:

 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 

Nå kan du hoppe rundt gjennom disse mappene og jobbe med stable som med aliaser for mappene.Jeg antar at følgende del er selvforklarende:

 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 

Tilleggstips er å lage et alias for dirs -v.

For eksempel:

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

Kommentarer

  • Og du kan fjerne stabelen ved å dirs -c
  • +1 for faktisk gir noen praktiske eksempler. Det er ‘ lett å se hva pushd / popd gjør fra mannssiden, men dirs og cd ~ # er ikke åpenbare i begynnelsen.
  • Du kan også bruke en løsning som fasd for denne typen arbeidsflyt i stedet, skjønt
  • @Jun, der ‘ s » mkdir dir {1,2,3} » for å lage tre kataloger i ett skudd.
  • @JunMurakami dette gjorde året mitt! Godt 2020!

Svar

En enkel brukstilfelle for å bruke dirs stack det du ikke kan gjøre med bare cd er :

pushd . legger til den aktuelle katalogen XX i dirs -stakken. Etterpå kan du flytte rundt ved hjelp av cd, og for å gå tilbake til XX, gjør du bare popd uansett hvor «langt borte» du er i katalogtreet (kan hoppe over flere nivåer, sidelengs osv.). Spesielt nyttig i bash-skript.

Kommentarer

  • Jeg tror dette er den funksjonen jeg benytter meg av ofte. Fordi pushd / popd fungerer uavhengig av cd, kan du bruke dem som en mer stabil bokmerke enn cd -.
  • for meg er dette ikke sant. Hver gang jeg bruker cd, endres stakken min.
  • åh det var veldig koselig å bruke zsh, når jeg bytter til bash, fungerer det bra
  • Dette er det eneste materielle svaret når det gjelder en sammenligning med cd -, IMO. Som om pushd foo; < tilfeldig dir som endrer >; popd er mer verdt enn a = foo; cd $ a; < tilfeldig dir som endrer >; cd $ a … For skript kan jeg se en liten syntaktisk bekvemmelighet i førstnevnte (pushd), men en massiv forbedring i klarhet i sistnevnte ([eksplisitte] variabler!). For en interaktiv økt, tror jeg at jeg bare vil anta at kataloghierarkiet mitt er organisert riktig i utgangspunktet, og hvis jeg bare mistet cd ~ / back / to / åpenbar / bane.
  • @HarendraSingh du don ‘ har tilfeldigvis AUTO_PUSHD satt? Det vil få cd til å oppføre seg som pushd, deaktivere det og du ‘ vil være tilbake til » normal oppførsel «.

Svar

pushd og popd lar deg manipulere katalogene på stakken.

Når du pushd en katalog, legger du den gjeldende katalogen i stakken og endrer katalogen til den som er angitt som parameter.

popd lar deg gå tilbake til katalogen på bunken.

Hvis du gjentar, vil kataloggjennomgangen være slags bevart, og du kan komme tilbake til de lagrede katalogene i omvendt rekkefølge fra det du lagret dem i.

Svar

For bash , i utgangspunktet: i stedet for å bruke cd kan man bruk pushd for å endre kataloger. Med praktisk bruk: historikken til besøkte kataloger lagres (riktig: stablet) og man kan bytte mellom dem:

pushd /home; pushd /var; pushd log 

For å se stakken, bruk dirs og for enklere navigering (for å få tallene til » stack-oppføringer » bruk:

dirs -v 

Utgang:

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

Bruk nå disse tallene med cd og ~ som:

cd ~1 

Men disse tallene er omorganisert nå og posisjonerer » 0 » endres, så bare pushd katalogen til topposisjonen to ganger (eller bruk en dummy på posisjon 0) som:

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

Nå vil 1..3 beholde sin posisjon

(For å frigjøre gjeldende katalog fra stakken / slett den fra historikken, bruk popd)

Svar

Pushd / popd er et så enkelt konsept som tok meg en stund å forstå, siden folk pleier å lære det ved å definere disse kommandoene som kommandoer som» manipulerer katalogstakken «, som etter min mening er veldig forvirrende.

Jeg ser på det på en annen måte:

pushd [folder_name] – vil cd til [folder_name] og vil dokumentere destinasjonen som er [folder_name] i en dir-stack mens den øverste katalogen i stabelen vil alltid være gjeldende dir du er i

popd – vil først cd deg inn katalogoppføringen som er på toppen av stakken, og fjern dokumentasjonen (fjern den fra dir-stakken)

dirs – Skriver ut dir-stakken (kan behandles som dir Db der den venstre oppføringen er den gjeldende katalogen (øverst i bunken)

De to mest brukte tilfellene er altså:

Bruk case 1: Navigering ved hjelp av pushd og 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 

La oss si Jeg gjorde det ovennevnte siden jeg vil navigere tilbake til de mappene jeg dokumenterte!

Merk at hvis jeg manuelt cd, vil jeg påvirke den øverste dir stack-oppføringen (som alltid er den nåværende dir)

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$ 

La oss navigere bakover nå:

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 

Igjen kan jeg dokumentere hva dir jeg vil og naviger deretter manuelt til en annen dir, så vil jeg være i stand til enkelt å gå tilbake til den dokumenterte dir jeg satte inn i bunken.

Bruk tilfelle 2: Navigering ved hjelp av numerisk stabelindeks

La oss si at jeg presset ved hjelp av pushd dir4 dir3 dir2 dir1, nå kjører dir -v vil vise:

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 

Nå kan du utføre en hvilken som helst Linux-operasjon som involverer kataloger ved hjelp av stakkeindeksen:

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 

Du kan til og med slette en bestemt oppføring fra dir-stakken:

root@mypc:/main$ popd ~4 

Håper det å bruke ordene «dokumentere» eller tenke på dir-stakken som en slags Db forenkler konseptet!

Svar

Enkelt sagt – når du trenger å navigere mellom mer enn 2 kataloger, vanligvis flere ganger tilbake & fremover, da cd - bare ikke klipper den med noe utover 2 mapper.

Så for eksempel i stedet for å prøve å komme opp med tidligere lange stier ved å se på bufferens historie eller tabulator og fullføre en lang sti, kan du bare stable de viktige opp, og om nødvendig flytter du dem enkelt med antallet alene. Å rotere mellom komplekse katalogstrukturer og lange stier blir glatt og raskt.

Med innebygde funksjoner kan du også bestille stakken på nytt eller vise katalogene du ikke trenger lenger, noe som gir fleksibilitet i arbeidsflyten.

Katalogstabling kan også brukes i skript på samme måte for operasjoner som strekker seg over flere kataloger.

Svar

I fant bruken av dirs / popd / pushd litt ubehagelig. Jeg kom opp med min personlige løsning i tcsh, ved å legge til følgende kode i .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*" 

på denne måten hadde jeg for eksempel alias «s.» for å lagre den nåværende arbeidsdir i filen ~ / .mydir. og «cd.» for å gjenopprette den dir når og hvor jeg vil. «del.» fjerner den tilsvarende filen; «hjem.» setter dir til hjemmet dir (tilsvarer cd; s.); «cdl» lister opp hva som er lagrede dirs. Merk at hvis du bruker ~ / Dropbox / .mydir $ b (eller en hvilken som helst annen skytjeneste som f.eks. ownCloud) i stedet for ~ / .mydir $ b får du en smart måte for å bruke dine foretrukne dirs på tvers av forskjellige kontoer og maskiner.

Svar

Bruk cd og cd - lar deg veksle mellom bare de to sist brukte katalogene. Størrelsen på «katalogarbeidsett» er to.

Ved å bruke pushd kan du beholde et vilkårlig stort antall kataloger i arbeidssettet ditt.

Jeg bruker pushd mesteparten av tiden i stedet for cd. Når du har bygget opp en stabel med aktive kataloger med pushd directory_name, kan du hoppe mellom dem hele dagen med 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. 

Jeg bruker sjelden popd, bare når jeg vil fjerne en katalog fra bunken når jeg vet at jeg er ferdig bruker den katalogen.

Gå til katalogen og fjern den fra stakken:

popd ~2 

Hold deg i gjeldende katalog og fjern en annen katalog fra stack:

popd +2 

Du ender opp med en arbeidsstil som ligner på å ha flere terminalvinduer eller faner åpne (en for hver katalog der du er aktivt fungerer), men alt i en terminal.Dette sparer fast eiendom på skjermen, pluss at fordi katalogstiene alle er tilgjengelige i ett skall, kan du gjøre ting som:

  • kopiere filer mellom kataloger du jobber med
  • se eller redigere filer i en annen katalog uten å gå dit

Eksempler:

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

I tcsh (men ikke bash), du kan til og med lagre katalogstakken din i en fil og gjenopprette den senere.

Lagre:

dirs -S ~/dirstack 

Gjenopprett:

dirs -L ~/dirstack 

Ellers er det bare å erstatte ~ i bash eksempler med = for bruk i tcsh.

pushd =2 popd =4 popd +1 

Svar

Jeg bruker den slik i bash_profilen min og .bashrc slik

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 

det hjelper s meg hoppe mellom kataloger til det siste som ble brukt på terminalen min. 🙂 Håper det hjelper deg å bruke pushd heller popd jeg bruker cd ~ stackednumber

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *