aktuelles Verzeichnis pushen / poppen?

66

Gibt es eine Möglichkeit, mit bash das aktuelle Arbeitsverzeichnis zu pushen und abzulegen? Ich habe versucht zu schreiben, bash;cd dir; ./dostuff;exit;aber das aktuelle Verzeichnis ist jetzt dir.


quelle

Antworten:

91

Es gibt pushdundpopd

Bash speichert einen Verlauf der von Ihnen besuchten Verzeichnisse. Sie müssen nur danach fragen. Bash speichert den Verlauf in einem Stapel und verwaltet den Stapel mit den Befehlen pushd und popd.

Mehr zu lesen

Beispiel:

$ pwd; pushd /tmp; pwd; popd; pwd
/home/me
/tmp ~
/tmp
~
/home/me
Nifle
quelle
1
Auszug aus dem Linkpushd Saves the current directory on the top of the directory stack and then cd to dir. With no arguments, pushd exchanges the top two directories.
Master Chief
31

Das Aufrufen bashstartet eine neue Subshell, die über eine eigene Eingabe verfügt. Keiner der anderen Befehle wird ausgeführt, bis er beendet wird. Wenn Sie die auszuführenden Befehle mit Parens umgeben, wird auch eine neue Subshell gestartet, die Befehle werden jedoch in dieser Subshell ausgeführt.

( cd dir ; ./dostuff )
Ignacio Vazquez-Abrams
quelle
1
Brillant! Push / Pop ist nicht erforderlich, wenn nur ein Befehl in einem anderen Verzeichnis ausgeführt werden soll (z. B. eine Abhängigkeit aktualisieren) und dann das aktuelle Verzeichnis wiederhergestellt werden soll.
Dan Dascalescu
12

Wenn Sie nicht mehrere Ebenen des Verzeichnisverlaufs benötigen, können Sie auch Folgendes tun:

cd foo
# do your stuff in foo
cd -

Im Vergleich zu pushd/ popdhat dies den Nachteil, dass cd fooSie im Falle eines Fehlers im falschen Verzeichnis mit landen cd -.

(Ist wahrscheinlich cd -praktischer außerhalb von Skripten. "Gehen wir zurück, wo ich gerade war.")

Tuomassalo
quelle
4

Ich verwende einen Alias, um die Änderungen in meinem Verzeichnis zu verfolgen, sodass ich irgendwo auf 'cd' zurückgreifen kann, wo ich 'cd' verwendet habe, oder auf zwei zurückgreifen kann, indem ich 'cd ..' usw .;

alias pushdd="pushd \$PWD > /dev/null"
alias cd='pushdd;cd'
alias ssh='ssh -A'
alias soc='source ~/.bashrc'
#below to go back to a previous directory (or more)
alias popdd='popd >/dev/null'
alias cd.='popdd'
alias cd..='popdd;popdd'
alias cd...='popdd;popdd;popdd'
alias cd....='popdd;popdd;popdd;popdd'
#below to remove directories from the stack only (do not 'cd' anywhere)
alias .cd='popd -n +0'
alias ..cd='popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0'
cdp
quelle
1
Können Sie genauer erklären, was dieser Code bewirkt?
bwDraco
Das ist schlau. Ich habe Aliase um meinen Pushd und Popd, um einige Dinge zu tun, die ich mag. Ich benutze die ganze Zeit den Verzeichnisstapel. Ich hasse es, Leute irgendwo auf CD zu sehen und dann zurückzuscrollen und nach dem vorherigen Verzeichnis zum Ausschneiden und Einfügen zu suchen. Ich kann den größten Teil meiner Arbeit aufgrund von Kontingenten nicht in meinem Home-Verzeichnis erledigen, daher muss ich Poolspeicher im Netzwerk verwenden.
Michael Mathews
1
Ist der Alias ..cdrobust genug? es sieht so aus, als würde es nur die letzten 10 Gegenstände vom Stapel entfernen.
Reynoldsnlp