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ždypopd
vrátím z kam jsem přišel Obvykle dělámpopd >/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ímpopd
?
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
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 nacd
, 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 jakopushd
, 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
dirs -c