Hur använder jag kommandon pushd och popd?

Vilka är de praktiska användningsområdena för både pushd och popd när det finns en fördel med att använda dessa två kommandon över cd och cd -?

REDIGERA : Jag letar efter några praktiska exempel på användningar för båda dessa kommandon eller skäl för att hålla stacken med kataloger (när du har fullbordat fliken, cd -, alias för att förkorta cd .., etc.).

Svar

pushd , popd och dirs är skalinbyggda som låter dig manipulera katalogstack . Detta kan användas för att ändra kataloger men återvända till den katalog som du kom från.

Till exempel

starta med följande kataloger:

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

pushd to dir1

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

dirs -kommandot bekräftar att vi har två kataloger på stacken nu. dir1 och originaldir, somedir. OBS: Vår ” nuvarande ” katalog är ~/somedir/dir1.

pushd till ../dir3 (eftersom vi är inne i dir1 nu)

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

dirs visar att vi har 3 kataloger i stacken nu. dir3, dir1 och somedir. Lägg märke till riktningen. Varje ny katalog läggs till vänster. När vi börjar poppa kataloger av, de kommer också från vänster.

Ändra kataloger manuellt till ../dir2

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

Börja nu poppa kataloger

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

Lägg märke till att vi poppade tillbaka till dir1.

Pop igen …

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

Och vi är tillbaka dit vi började, somedir.

Kan bli lite förvirrande, men huvudet på stac k är katalogen som du för närvarande finns i. Därför när vi kommer tillbaka till somedir, även om dirs visar detta:

$ dirs ~/somedir 

Vår stack är faktiskt tom.

$ popd bash: popd: directory stack empty 

Kommentarer

  • Tack, jag förstår helt begreppet stack och hur dessa kommandon fungerar. Jag ’ letar dock efter några praktiska skäl för att hålla stacken med kataloger (när du har fliken slutförd, cd -, alias för förkortning cd .., etc.).
  • Jag använder ofta pushd & popd i skript b / c sparar de mig från att behöva komma ihåg var jag kom ifrån, jag kan alltid bara popd för att komma tillbaka från där jag kom. Jag brukar göra popd >/dev/null 2>&1 för att göra det tyst. Jag använder cd- varje dag i mitt skal. Det finns också några andra tidsbesparande tips i den här artikeln: thegeekstuff.com/2008/10/… .
  • @Garrett – ingen som jag kan tänka mig.
  • @Garrett @slm eftersom cd - bara spårar den sista katalogen, jag antar att den skulle kunna ha problem om du ringer till en funktion som också ändrar katalog internt. i så fall kommer funktionen att återställas – till din nuvarande katalog, inte till den katalog du vill hoppa tillbaka till. pushd / popd är den säkraste metoden. Obs: jag har inte ’ testat min teori.
  • Varför inte gå tillbaka till ~/somedir/dir3 efter den första popd?

Svar

Det finns ett riktigt användbart användningsfall för pushd och popd kommandon för att arbeta med flera mappar samtidigt.

Du kan navigera i stacken mycket enkelt eftersom den räknas upp. Det betyder att du kan ha flera arbetsmappar till ditt förfogande under arbetet.

Se ett enkelt exempel nedan.


Låt oss först skapa exempel på mappstruktur.

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

Sedan kan du lägga till alla dina mappar i stacken :

 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å upp det med:

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

För att navigera säkert, du måste lägga till den sista (noll) mappen två gånger, eftersom den alltid kommer att skrivas 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 

Nu kan du hoppa runt genom dessa mappar och arbeta med stapla som med alias för mapparna.Jag antar att följande del är självförklarande:

 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 

Ytterligare tips är att skapa ett alias för dirs -v.

Till exempel:

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

Kommentarer

  • Och du kan rensa stapeln med dirs -c
  • +1 för faktiskt ger några praktiska exempel. ’ är lätt att se vad pushd / popd gör från man-sidan, men dirs och cd ~ # är inte uppenbara först.
  • Du kan också använda en lösning som fasd för den här typen av arbetsflöde istället, dock
  • @Jun, där ’ s ” mkdir dir {1,2,3} ” för att skapa tre kataloger i ett tag.
  • @JunMurakami detta gjorde mitt år! Happy 2020!

Svar

Ett enkelt användningsfall för att använda dirs stack vad du inte kan göra med bara cd är :

pushd . lägger till aktuell katalog XX till dirs stack. Efteråt kan du flytta runt med cd och för att återvända till XX gör du bara popd oavsett hur ”långt bort” du befinner dig katalogträdet (kan hoppa över flera nivåer, i sidled etc). Särskilt användbart i bash-skript.

Kommentarer

  • Jag tror att det är den funktionen jag utnyttjar oftast. Eftersom pushd / popd fungerar oberoende av cd kan du använda dem som en mer stabil bokmärke än cd -.
  • för mig är detta inte sant. Varje gång jag använder cd ändras min stack.
  • Åh det var coz att använda zsh, när jag byter till bash, fungerar det bra
  • Detta är det enda innehållssvaret när det gäller en jämförelse med cd -, IMO. Om huruvida pushd foo; < slumpmässig dir-ändring >; popd är mer värdefullt än a = foo; cd $ a; < slumpmässig dir-ändring >; cd $ a … För skript kan jag se en liten syntaktisk bekvämlighet i den förra (pushd), men en massiv förbättring av tydligheten i de senare ([explicita] variablerna!). För en interaktiv session tror jag att jag bara antar att min kataloghierarki är ordnad ordentligt från början, och om jag går vilse helt enkelt cd ~ / tillbaka / till / uppenbar / sökväg.
  • @HarendraSingh du don ’ har inte AUTO_PUSHD inställt? Det gör att cd beter sig som pushd, avmarkerar det och du ’ kommer tillbaka till ” normalt beteende ”.

Svar

pushd och popd låter dig manipulera katalogerna på stacken.

När du pushd en katalog lägger du den aktuella katalogen i stacken och ändrar katalogen till den som anges som parameter.

popd gör att du kan gå tillbaka till katalogen på stacken.

Om du upprepar kommer kataloggenomgången att vara bevarad och du kan komma tillbaka till de sparade katalogerna i omvänd ordning från vad du sparade dem i.

Svar

För bash , i princip: istället för att använda cd kan man använd pushd för att byta katalog. Med praktisk användning: historiken för besökta kataloger sparas (korrekt: staplad) och man kan växla mellan dem:

pushd /home; pushd /var; pushd log 

För att se stacken använd dirs och för enklare navigering (för att få numren på ” stack-poster ” använd:

dirs -v 

Output:

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

Använd nu dessa siffror med cd och ~ som:

cd ~1 

Men dessa siffror ordnas nu och placeras ” 0 ” ändras, så bara pushd katalogen till topposition två gånger (eller använd en dummy på position 0) som:

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

Nu kommer 1..3 att behålla sin position

(För att frigöra den aktuella katalogen från stapeln / ta bort den från historiken, använd popd)

Svar

Pushd / popd är ett så enkelt koncept som tog mig en stund att förstå eftersom människor tenderar att lära ut det genom att definiera dessa kommandon som kommandon som” manipulerar katalogstacken ”vilket enligt min mening är mycket förvirrande.

Jag tittar på det på ett annat sätt:

pushd [mappnamn] – cd till [mappnamn] och dokumenterar destinationen som är [mappnamn] i en dir-stack medan den översta katalogen i stacken kommer alltid att vara den aktuella dir som du befinner dig i

popd – kommer först att skicka dig till katalogposten som ligger ovanpå stacken och ta bort dokumentationen (ta bort den från dir stacken)

dirs – Skriver ut dir-stacken (kan behandlas som dir Db där posten längst till vänster är den aktuella katalogen (högst upp i stacken)

Så de två mest populära användningsfallen är:

Användningsfall 1: Navigera med pushd och 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 

Låt oss säga Jag gjorde ovanstående eftersom jag skulle vilja navigera tillbaka till de mappar som jag dokumenterade!

Observera att om jag manuellt cd, kommer jag att påverka den översta posten för dir stack (som alltid är den aktuella 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$ 

Låt oss navigera bakåt nu:

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 

Återigen kan jag dokumentera vad jag vill och navigera sedan manuellt till en annan dir då kommer jag enkelt att kunna återgå till den dokumenterade dir jag satte in i stacken.

Använd fall 2: Navigera med hjälp av numeriskt stackindex

Låt oss säga att jag tryckte med pushd dir4 dir3 dir2 dir1, nu kör dir -v kommer att visa:

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 

Nu kan du utföra alla Linux-operationer som involverar kataloger med stackindex:

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 till och med radera en specifik post från dir stacken:

root@mypc:/main$ popd ~4 

Hoppas att använda orden ”dokumentera” eller tänka på dir stacken som någon form av Db förenklar konceptet!

Svar

Enkelt uttryckt – när du behöver navigera mellan mer än två kataloger, vanligtvis flera gånger tillbaka & framåt, eftersom cd - bara inte klippte den med något utöver två mappar.

Så till exempel istället för att försöka återkomma med tidigare långa banor genom att titta på din bufferthistorik eller genom att fylla i en lång väg, staplar du helt enkelt de viktiga och om det behövs flyttar du enkelt till dem med deras nummer ensamt. Att rotera mellan komplexa katalogstrukturer och långa banor blir smidigt och snabbt.

Med de inbyggda kan du också ordna om stacken eller visa de kataloger som du inte behöver längre, vilket ger flexibilitet i ditt arbetsflöde.

Katalogstapling kan också användas i skript på samma sätt för operationer som spänner över flera kataloger.

Svar

I tyckte att användningen av dirs / popd / pushd var lite obekväm. Jag kom fram till min personliga lösning i tcsh, genom att lägga till följande kod 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å det här sättet aliasade jag till exempel ”s.” för att spara den nuvarande arbetsdir i filen ~ / .mydir. och ”cd.” för att återställa den dir när och var jag vill. ”del.” tar bort motsvarande fil; ”hem.” ställer in dir till hem-dir (motsvarar cd; s.); ”cdl” listar vad som är sparade dir. Observera att om du använder ~ / Dropbox / .mydir $ b (eller någon annan molntjänst som t.ex. ownCloud) istället för ~ / .mydir $ b får du ett smart sätt för att använda dina önskade dirs över olika konton och maskiner.

Svara

Använda cd och cd - låter dig växla mellan endast dina två senast använda kataloger. Din ”katalogsats” -storlek är två.

Med hjälp av pushd kan du behålla ett godtyckligt stort antal kataloger i din arbetsuppsättning.

Jag använder pushd för det mesta istället för cd. När du väl har byggt upp en stapel aktiva kataloger med pushd directory_name kan du sedan hoppa mellan dem hela 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. 

Jag använder popd sällan, bara när jag vill ta bort en katalog från stacken när jag vet att jag är klar använder den katalogen.

Gå till katalogen och ta bort den från stacken:

popd ~2 

Håll dig i aktuell katalog och ta bort en annan katalog från stack:

popd +2 

Du får en arbetsstil som liknar att ha flera terminalfönster eller flikar öppna (en för varje katalog där du aktivt är fungerar), men allt i en terminal.Detta sparar skärmfastigheter, plus eftersom katalogvägarna alla är tillgängliga i ett skal kan du göra saker som:

  • kopiera filer mellan kataloger som du för närvarande arbetar med
  • visa eller redigera filer i en annan katalog utan att gå dit

Exempel:

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

I tcsh (men inte bash), du kan till och med spara din katalogstack i en fil och återställa den senare.

Spara:

dirs -S ~/dirstack 

Återställ:

dirs -L ~/dirstack 

Annars ersätter du bara ~ i bash exempel med = för användning i tcsh.

pushd =2 popd =4 popd +1 

Svar

Jag använder den så här i min bash_profile och .bashrc så här

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 hjälper s mig hoppa mellan kataloger till det senaste som används på min terminal. 🙂 Hoppas det hjälper dig att använda pushd snarare popd jag använder cd ~ stackednumber

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *