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 å forkortecd ..
osv.). - Jeg bruker ofte
pushd
&popd
i skript b / c de redder meg fra å måtte huske hvor jeg kom fra, jeg kan alltid barepopd
for å komme tilbake fra hvor jeg kom. Jeg pleier å gjørepopd >/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ørstepopd
?
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
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 avcd
, kan du bruke dem som en mer stabil bokmerke enncd -
. - 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 sompushd
, 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
dirs -c