Jak mohu použít příkazy pushd a popd?

Jaká je praktická využití pushd a popd když je výhodou použití těchto dvou příkazů nad cd a cd -?

EDIT : Hledám několik praktických příkladů použití obou těchto příkazů nebo důvody pro uchování zásobníku s adresáři (pokud máte dokončení karty, cd -, aliasy pro zkrácení cd .. atd.).

Odpovědět

pushd , popd a dirs jsou vestavěné prostředí, které vám umožní manipulovat s zásobníkem adresářů . To lze použít ke změně adresářů, ale k návratu do adresáře, ze kterého jste přišli.

Například

spustit s následujícími adresáři:

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

pushd to dir1

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

dirs příkaz potvrzuje, že v zásobníku máme nyní 2 adresáře. dir1 a původní adresář somedir. POZNÁMKA: Naše “ aktuální “ je ~/somedir/dir1.

pushd do ../dir3 (protože teď jsme uvnitř dir1)

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

dirs ukazuje, že v zásobníku máme nyní 3 adresáře. dir3, dir1 a somedir. Všimněte si směru. Každý nový adresář se přidává doleva. Když začneme vyskakovat adresáře vypnuto, budou také pocházet zleva.

ručně změňte adresáře na ../dir2

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

Nyní začněte vyskakovat adresáře

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

Všimněte si, že jsme se vrátili zpět do dir1.

Pop znovu …

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

A jsme zpět tam, kde jsme začali, somedir.

Mohlo by to být trochu matoucí, ale hlava stac k je adresář, ve kterém se právě nacházíte. Proto, když se vrátíme zpět do somedir, přestože dirs ukazuje toto:

$ dirs ~/somedir 

Náš zásobník je ve skutečnosti prázdný.

$ popd bash: popd: directory stack empty 

Komentáře

  • Díky, zcela rozumím konceptu zásobníku a fungování těchto příkazů. ‚ Hledám však několik praktických důvodů pro uchování zásobníku s adresáři (pokud máte dokončení karty, cd -, aliasy pro zkrácení cd .. atd.).
  • Často používám pushd & popd ve skriptech b / c, které mi ušetří pamatovat si, odkud jsem přišel, se vždy popd vrátím z kam jsem přišel Obvykle dělám popd >/dev/null 2>&1 ticho. Používám cd- každý den ve svém shellu. V tomto článku najdete také několik dalších tipů na úsporu času: thegeekstuff.com/2008/10/… .
  • @Garrett – nic, co si dokážu představit.
  • @Garrett @slm, protože cd - sleduje pouze poslední adresář, myslím, že by být možné mít problémy, pokud zavoláte funkci, která také interně mění adresář. v takovém případě by se funkce resetovala – do vašeho aktuálního adresáře, nikoli do adresáře, do kterého se chcete vrátit. pushd / popd je nejbezpečnější metoda. Poznámka: Moje teorie jsem ‚ netestovala.
  • Proč se nevrátit k ~/somedir/dir3 po prvním popd?

odpověď

Existuje opravdu užitečný případ použití pro pushd a popd příkazy pro práci s několika složkami současně.

Stoh můžete snadno procházet, protože je vyjmenován. To znamená, že během práce můžete mít k dispozici několik pracovních složek.

Níže uvádíme jednoduchý příklad.


Nejprve si vytvořme ukázkovou strukturu složek.

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

Poté můžete do zásobníku přidat všechny své složky :

 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 

Vyhledat můžete pomocí:

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

Chcete-li bezpečně navigovat, poslední (nulovou) složku musíte přidat dvakrát, protože se vždy přepíše:

 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 

Nyní můžete procházet tyto složky a pracovat s stohovat jako s aliasy pro složky.Myslím, že následující část je samozřejmá:

 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 

Další tip je vytvořit nějaký alias pro dirs -v.

Například:

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

Komentáře

  • Zásobník můžete vyčistit pomocí dirs -c
  • +1 pro ve skutečnosti uvádím několik praktických příkladů. ‚ Je snadné vidět, co pushd / popd dělají z manuálové stránky, ale dirs a cd ~ # nejsou na první pohled patrné.
  • můžete také použít řešení jako fasd pro tento druh pracovního postupu, ačkoli
  • @Jun existuje ‚ s “ mkdir dir {1,2,3} “ vytvořit 3 adresáře v jednom záběru.
  • @JunMurakami, díky tomu se stal můj rok! Happy 2020!

Answer

Jeden jednoduchý případ použití pro použití dirs stacku, co nemůžete udělat pouhým cd, je :

pushd . přidá do adresáře dirs aktuální adresář XX. Poté se můžete pohybovat pomocí cd a pro návrat do XX stačí popd bez ohledu na to, jak daleko jste v adresářový strom (může skákat přes více úrovní, do stran atd.). Obzvláště užitečné v bash skriptech.

Komentáře

  • Myslím, že toto je funkce, kterou využívám nejčastěji. Protože pushd / popd fungují nezávisle na cd, můžete je použít jako stabilnější záložka než cd -.
  • pro mě to není pravda. Pokaždé, když použiji cd, změní se můj zásobník.
  • oh, což bylo coz použití zsh, když změním na bash, funguje to dobře
  • toto je jediná věcná odpověď, pokud jde o srovnání s cd -, IMO. Pokud jde o to, zda pushd foo; < náhodná změna adresáře >; popd je cennější než a = foo; cd $ a; < náhodná změna adresáře >; cd $ a … U skriptů vidím malé syntaktické pohodlí v prvním (pushd), ale obrovské zlepšení jasnosti v druhém ([explicitní] proměnné!). Pro interaktivní relaci si myslím, že bych měl na prvním místě správně uspořádanou hierarchii adresářů, a kdybych se ztratil, jednoduše cd ~ / back / to / evident / path.
  • @HarendraSingh ‚ není náhodou nastavena AUTO_PUSHD? cd se bude chovat jako pushd, deaktivuje se a vy ‚ se vrátíte zpět “ normální chování „.

Odpovědět

pushd a popd vám umožňují manipulovat s adresáři v zásobníku.

Když pushd adresář, vložíte aktuální adresář do zásobníku a změníte adresář na ten, který je zadán jako parametr.

popd vám umožní vrátit se do adresáře v zásobníku.

Pokud budete postup opakovat, bude procházení adresáře tak trochu zachováno a můžete se vrátit k uloženým adresářům v opačném pořadí, než ve kterém jste je uložili.

Odpovědět

Pro bash v zásadě: místo použití cd lze použijte pushd ke změně adresářů. S praktickým využitím: historie navštívených adresářů se ukládá (správně: skládané) a lze mezi nimi přepínat:

pushd /home; pushd /var; pushd log 

Chcete-li zásobník zobrazit, použijte dirs a pro snazší navigaci (pro získání čísel “ stack-entries “ použijte:

dirs -v 

Výstup:

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

Nyní použijte tato čísla s cd a ~ like:

cd ~1 

Ale tato čísla jsou nyní přeskupena a pozice “ 0 “ se změní, takže stačí pushd adresář umístit dvakrát nahoru (nebo použít figurína na pozici 0) jako:

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

Nyní si 1..3 udrží svou pozici

(Chcete-li uvolnit aktuální adresář z zásobník / jeho odstranění z historie, použijte popd)

Odpovědět

Pushd / popd je tak jednoduchý koncept, který mi chvíli trvalo, než jsem ho pochopil, protože lidé mají tendenci ho učit definováním těchto příkazů jako příkazů, které„ manipulují s adresářovým zásobníkem “, což je podle mého názoru velmi matoucí.

Dívám se na to jinak:

pushd [název_složky] – zkopíruje cd na [Folder_name] a zdokumentuje cíl, který je [Folder_name] v zásobníku dir, zatímco hlavní adresář v zásobníku bude vždy aktuální adresář, ve kterém se nacházíte

popd – nejprve vás CD záznam adresáře, který je v horní části zásobníku, a poté odstraňte dokumentaci (odeberte ji ze zásobníku dir)

dirs – Vytiskne dir stack (lze jej považovat za dir Db, kde je položka nalevo od aktuálního adresáře (horní část zásobníku)

Takže 2 nejpopulárnější případy použití jsou:

Případ použití 1: Navigace pomocí pushd a 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 

Řekněme Udělal jsem výše uvedené, protože bych chtěl přejít zpět do těch složek, které jsem zdokumentoval!

Všimněte si, že když ručně cd, ovlivním to horní položku zásobníku dir (což je vždy aktuální 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$ 

Pojďme nyní přejít zpět:

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 

Znovu mohu dokumentovat, co chci a poté ručně přejít do jiného adresáře, poté se budu moci snadno vrátit k dokumentovanému adresáři, který jsem vložil do zásobníku.

Použít případ 2: Navigace pomocí číselného indexu zásobníku

Řekněme, že jsem odeslal pomocí pushd dir4 dir3 dir2 dir1, nyní běžící dir -v zobrazí:

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 

Nyní můžete pomocí indexu zásobníku provádět jakoukoli operaci systému Linux, která zahrnuje adresáře:

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 

Můžete dokonce odstranit konkrétní vstup z dir stacku:

root@mypc:/main$ popd ~4 

Doufám, že použití slov „documenting“ nebo přemýšlení o dir stacku jako nějaký druh Db zjednodušuje koncept!

Odpověď

Jednoduše řečeno – když potřebujete navigovat mezi více než 2 adresáři, obvykle několikrát zpět & dále, protože cd - to prostě neřízne s ničím jiným než 2 složkami.

Takže například místo toho, abyste se pokusili znovu přijít s předchozími dlouhými cestami tím, že se podíváte na historii vašeho bufferu nebo dokončíte dlouhou cestu pomocí karet, jednoduše stohujete ty důležité nahoru a v případě potřeby se na ně pohodlně přesunete pouze podle jejich počtu. Rotace mezi složitými strukturami adresářů a dlouhými cestami se stává úhledným a rychlým.

Vestavěné funkce také umožňují změnit pořadí zásobníku nebo vyskakování adresářů, které již nepotřebujete, což umožňuje flexibilitu vašeho pracovního toku.

Stohování adresářů lze také použít ve skriptech podobně pro operace, které zahrnují několik adresářů.

Odpovědět

I shledal použití dirs / popd / pushd trochu nepohodlným. Přišel jsem s mým osobním řešením v tcsh přidáním následujícího kódu do .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*" 

tímto způsobem jsem aliasoval například „p.“ pro uložení aktuálního pracovního adresáře do souboru ~ / .mydir. a „cd.“ pro obnovení tohoto adresáře kdykoli a kdekoli se mi líbí. „del.“ odstraní odpovídající soubor; „home.“ nastaví adresář na domovský adresář (ekvivalent k cd; str.); „cdl“ vypíše seznam uložených adresářů. Upozorňujeme, že pokud používáte ~ / Dropbox / .mydir $ b (nebo jakoukoli jinou cloudovou službu jako např. ownCloud) místo ~ / .mydir $ b získáte chytrý způsob používat vaše preferované adresáře napříč různými účty a stroji.

Odpovědět

Pomocí cd a cd - umožňuje přepínat pouze mezi dvěma naposledy použitými adresáři. Velikost vaší „pracovní sady adresářů“ je dvě.

Pomocí pushd můžete ve své pracovní sadě uchovávat libovolně velké množství adresářů.

Většinu času používám pushd místo cd. Jakmile vytvoříte hromadu aktivních adresářů s pushd directory_name, můžete mezi nimi přeskakovat celý den pomocí 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. 

Používám popd zřídka, pouze když chci odstranit adresář ze zásobníku, když vím, že jsem hotový pomocí tohoto adresáře.

Přejděte do adresáře a odeberte jej ze zásobníku:

popd ~2 

Zůstaňte v aktuálním adresáři a odeberte jiný adresář z stack:

popd +2 

Skončíte s pracovním stylem, který je podobný tomu, že máte otevřeno více terminálových oken nebo karet (jeden pro každý adresář, ve kterém jste aktivně funkční), ale vše v jednom terminálu.To šetří nemovitost na obrazovce a navíc, protože cesty k adresářům jsou k dispozici v jednom prostředí, můžete dělat například:

  • kopírovat soubory mezi adresáři, se kterými aktuálně pracujete
  • prohlížet nebo upravovat soubory v jiném adresáři, aniž byste se do nich dostali

Příklady:

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

V tcsh (ale ne bash), můžete svůj adresářový zásobník dokonce uložit do souboru a později jej obnovit.

Uložit:

dirs -S ~/dirstack 

Obnovit:

dirs -L ~/dirstack 

Jinak stačí nahradit ~ v bash příkladech s = pro použití v tcsh.

pushd =2 popd =4 popd +1 

odpověď

Používám to takhle v mém bash_profile a .bashrc takto

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 

pomáhá Skočím mezi adresáři do nejnovějších použitých na mém terminálu. 🙂 Doufám, že vám pomůže použít pushd, spíše popd, použiji cd ~ stackednumber

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *