In einem der Tutorials, die ich verfolgt habe, wurde kurz gesagt, dass cd .
es keine Verwendung hat. Wenn versucht wird, das von OP in der Rekursion symbolischer Verknüpfungen angezeigte Problem zu replizieren, warum wird es dann zurückgesetzt? Ich habe auch versucht cd .
, den gleichen Effekt OP zu zeigen (wachsende $PWD
Variable), mit dem entgegengewirkt werden kann cd -P
.
Das lässt mich wundern, gibt es einen Fall, in dem man tatsächlich nutzen möchte cd .
?
cd-command
Sergiy Kolodyazhnyy
quelle
quelle
cd .
diese Überprüfungen aus, weil sie kurz und einfach sind. Obwohl ich denke, dass Sie die Frage für eine Vanille-Umgebung gedacht haben.$PWD
,cd .
ändert sich auch$OLDPWD
in das aktuelle Verzeichnis. Ich habe (derzeit) keine Ahnung, warum dies nützlich sein könnte, aber der Vollständigkeit halber ...cd .
, obwohl ich die Antworten unten gesehen habe, vielleicht in der Zukunft, aber ich habe sie gelegentlich verwendet,pushd .
als ich später in der Lage sein wollte, zupopd
diesem Verzeichnis zurückzukehren. Wenn Sie beispielsweise ein Build-Skript ausführenconfigure
, dascd output...
und ausführt , undmake
wenn dies abgeschlossen ist, möchte ich zum ursprünglichen Verzeichnis zurückkehren. Anstatt meine eigene Kopie des Buildskripts zu pflegen, die sich von den Erwartungen aller anderen unterscheidet, führe ich es einfach so auspushd .; ./BuildScriptName.sh; popd
, und dies gibt mir auch die Freiheit, nichtpopd
manchmal und dannpopd
später stattdessen./bin/cd
hier lesen unix.stackexchange.com/q/50058/85039Antworten:
Ich denke, das überdenkt das Problem.
cd .
Es kann sein, dass dies nicht etwas ist, das man im normalen Ablauf manuell ausführen würde, aber es ist definitiv etwas, das bei der programmgesteuerten Ausführung auftreten kann (denken Sie an jede Situation, in der Sie möglicherweisecd
zu dem Verzeichnis gelangen, das eine Datei enthält, deren Pfad vom Benutzer angegeben wird ). Daher muss es nicht speziell verwendet werden: Solange es die gewohnte Semantik von erfülltcd <some-path>
, ist es nützlich.quelle
.
sollte als gültiger Pfad durch diecd
Syntax genau richtig behandelt werden.IFS= read Dir; do cd "$Dir"; do_something; done < <(find . -type d)
. Find wird.
im Verlauf als Pfad erzeugt , so dass der Befehl zucd "$Dir"
expandiertcd .
. In Skripten ist es also vollkommen nützlich.cd ${path_to_directory}
, aber irgendwann stellt sich heraus, dass es sich bei dem Verzeichnis um das aktuelle Verzeichnis handelt.path_to_directory = .
Sie müssten alsocd .
nur für alle Fälle arbeiten.if
Prüfungen undelse
Klauseln, jede Art von Sondergehäuse) unnötig macht.Der Pfad des Verzeichnisses könnte sich geändert haben, seit der letzte Befehl ausgeführt wurde, und ohne
cd .
die Shells bash und ksh93 wird das in dem in der Frage verlinkten Beitrag beschriebene logische Arbeitsverzeichnis verwendet. Wenn Sie alsocd .
das Shell-Problem aufrufen ,getcwd()
wird Ihr Syscall sichergestellt Der aktuelle Pfad ist weiterhin gültig.Schritte zum Reproduzieren in Bash:
mkdir ./dir_no_1; cd ./dir_no_1
mv dir_no_1 dir_no_2
echo $PWD
undpwd
. Beachten Sie, dass das Verzeichnis extern umbenannt wurde. Die Umgebung der Shell wurde nicht aktualisiert.cd .; pwd; echo $PWD
. Beachten Sie, dass der Wert aktualisiert wurde.ksh93 aktualisiert jedoch nicht die Umgebungsinformationen, so dass
cd .
ksh93 in der Tat unbrauchbar sein kann. In/bin/dash
auf Ubuntu und andere Debian-basierten Systemencd .
gibtdash: 3: cd: can't cd to .
Fehler, jedochcd -P .
funktioniert ( im Gegensatz zu in ksh93).quelle
mv ../dir_no_1 ../dir_no_2
im gleichen Terminal / Bash tun .pwd
ist in der Tat ein eingebautes, jedoch hat das Aufrufen/bin/pwd
keine Auswirkung auf die Umgebung der Shell - externe Dienstprogramme beeinflussen die Shell-Umgebung im Allgemeinen nicht. Der Grund, warum/bin/cd
und/bin/pwd
vorhanden ist, liegt unter anderem in der POSIX-Konformität. Es gibt eine gute Diskussion über externe CD von denen einige wahrscheinlich gilt/bin/pwd
auchEin weiterer Anwendungsfall von
cd .
wäre, wenn das Verzeichnis, in dem Sie sich gerade befinden, gelöscht und dann erneut erstellt wurde. Versuchen Sie Folgendes:temp
cd temp
und dann mach einls
temp
ls: cannot open directory .: Stale file handle
cd .
und dann funktioniert ein ls gutquelle
cd: can't cd to .
Jetzt, wo ich es mir ansehe, wird dies bereits in Sergijs Antwort erwähnt (Verschieben, Löschen / Neuerstellen - im Wesentlichen dasselbe: Das Verzeichnis, in dem Sie sich befinden, ist nicht mehr das, was sich im Original befand Weg)cd .
, um in das neue Verzeichnis mit demselben Namen zu wechseln.cd .
ganze Zeit, wenn ich eine Shell habe, deren aktuelles Arbeitsverzeichnis mit sshfs gemountet wurde, aber die ssh-Sitzung geschlossen und wieder geöffnet wurde.PWD
Umgebungsvariablen) und durchlaufen Sie die Dateisystemhierarchie vom Stammverzeichnis bis zu einem Verzeichnis, über das zufällig erreichbar ist dieser Pfad, ob es sich tatsächlich um das gleiche Verzeichnis handelt oder nicht. Dies passt genau zum Anwendungsfall in dieser Antwort.cd .
funktioniert, wenn die Verknüpfung des Verzeichnisses aufgehoben wurde und ein neues, anderes Verzeichnis unter demselben Dateisystempfad erstellt wird. Das aktuelle Arbeitsverzeichnis wurde nicht verlinkt und hat vermutlich als Teil davon keinen.
oder..
-Eintrag mehr, und selbst wenn dies der.
Fall ist, sollte der Eintrag weiterhin auf sich selbst verweisen. Es sieht so aus, als würde die Shell oder der Kernel den Befehl cd basierend auf dem Verzeichnispfadnamen ausführen, anstatt einfach auf den.
Eintrag zuzugreifen . Kann jemand dieses Verhalten bestätigen?Sie können
$OLDPWD
mit einem kurzen klarstellencd .
, ob es einen Fall geben soll, in dem Sie nicht wollen, dass er irgendwo "interessant" ist. Es wird auch beeinflussencd -
.quelle
Programmatisch ist es als No-Op nützlich. Betrachten Sie einen Pfad, der von einer externen Eingabe bereitgestellt wird.
Bei einem Pfad wie "fred.txt" wird das Verzeichnis
.
zucd .
quelle
dirname
Befehl wird.
bei Bedarf generiert , um zu vermeiden, dass Code beschädigt wird, der einen Pfad aufteilen kann.Dies ist häufig der Fall, wenn Sie mit einem fehlerhaften USB-Kabel arbeiten mussten. Nachdem ein Gerät getrennt und wieder verbunden wurde und automatisch in dasselbe Verzeichnis gemountet wurde, müssen Sie verwenden
cd .
, damit es wieder funktioniert.quelle
Beachten Sie, dass "." ist die richtige Methode, um den Namen der Datei anzugeben, die als aktuelles Arbeitsverzeichnis eines Prozesses (einschließlich natürlich eines Shell-Prozesses) geöffnet ist, und "." ist immer ein gültiger Name einer Datei in allen Verzeichnissen, einschließlich des aktuellen Arbeitsverzeichnisses. Der Name ist
.
möglicherweise kein gültiger Name für eine Datei für eine bestimmte Instanz eines Prozesses, wenn beispielsweise das zugrunde liegende aktuelle Arbeitsverzeichnis entfernt wurde (oder "fehlerhaft" geworden ist, z. B. ein veralteter NFS-Punkt), es ist jedoch ein gültiger Name einer Datei, die garantiert in jedem gültigen Verzeichnis existiert.So
.
muss ein gültiges Argument für jeden Befehl sein, der den Namen eines Verzeichnisses akzeptiert, und damit in der Standard - Shellcd .
muss ein gültiger Befehl sein.Ob dies
cd .
sinnvoll ist oder nicht, hängt von der Shell-Implementierung ab. Wie bereits erwähnt, kann es nützlich sein, wenn die Shell nach dem Aufrufen des zugrunde liegendenchdir
Systemaufrufs ihre interne Idee des vollständigen Pfadnamens des aktuellen Arbeitsverzeichnisses zurücksetzt , z. B. wenn das zugrunde liegende Verzeichnis (oder ein übergeordnetes Verzeichnis davon) umbenannt wurde.Zumindest einige der mir bekannten Shells (
/bin/sh
unter FreeBSD und NetBSD) konvertierencd ""
incd .
, was wohl eine Funktion zur Unterstützung der programmgesteuerten Verwendung in einem Shell-Skript sein kann, bei der eine Variable als Parameter verwendet werden kann (dh das Konvertieren einer leeren Variablensubstitution in eine " "nichts tun"), obwohl der FreeBSD-Commit-Verlauf besagt, dass die Änderung direkt auf das Hinzufügen von POSIX-Unterstützung zurückzuführen ist, um einen Fehler zu verhindernchdir("")
, bei dem POSIX-Mandate fehlschlagen müssen.Einige andere Shells ersetzen das,
.
was sie als vollständig qualifizierten Pfadnamen zu ihrem aktuellen Arbeitsverzeichnis gespeichert haben, und daher kann dies für sie das in Sahil Agarwals Antwort erwähnte Verhalten zulassen .quelle
Ich habe diesen Befehl erst heute verwendet, als ich den Zweig, an dem ich in Git gearbeitet habe, von einem Verzeichnis aus neu basierte, das zuerst auf demselben Zweig erstellt wurde. Der Rebase ging gut, aber danach
git status
warf einen Fehler. Nachdemcd .
alles normal war.(Ich habe übrigens in MobaXterm unter Windows gearbeitet. Nur für den Fall, dass Sie versuchen, dies zu reproduzieren. Auf anderen Systemen ist dies möglicherweise nicht möglich.)
Ich habe diesen Befehl auch in Verzeichnissen verwendet, die durch einen automatisierten Prozess aktualisiert werden, der das alte Verzeichnis beiseite schiebt und durch ein neues ersetzt (so dass es möglichst atomar ist). Keine alltägliche Situation, aber
cd .
genau das, was benötigt wird.Nach dem Lesen dieser ausgezeichneten Antwort von Stephane Chazelas:
Ich verstehe jetzt, dass meine oben genannten Anwendungsfälle nur funktionieren, weil ich sie verwende
bash
, in denen siecd .
äquivalent sind zucd "$PWD"
. Ich empfehle dringend, die verlinkte Antwort zu lesen.quelle
Ich benutze es,
cd .
um das Zeug, mit dem ich überladen bin,cd
über einebash
Funktion erneut auszuführen .Von meinem
~/.bashrc
:quelle
EDIT: Dies wurde von Sahil bereits zuvor vorgeschlagen .
Dies ist nützlich, wenn Sie sich in einem Ordner befinden, der von einem anderen Prozess gelöscht und neu erstellt wurde. Angenommen, die beiden Terminalsitzungen
$1
und$2
:Ich bin nicht sicher, ob genau (OS, SHELL, ...?) Die Ursache für dieses Verhalten ist.
quelle
Nein, es hat keinen Sinn. Weder in der Skripterstellung tut es einfach nichts.
quelle
$PWD
und möglicherweise andere Shell-Funktionen aufrufen, wenn der Benutzer eine eigenecd
Funktion oder einen eigenen Alias angegeben hat, um das eingebaute System zu überlastencd
. Es wird auch überprüft, ob das aktuelle Verzeichnis noch gültig ist und ob die aktuelle Verwendung die Berechtigung hat, dort zu sein.cd .
sich beschweren , wenn das Skript oder die interaktive Shell eines anderen Benutzers dieses Verzeichnis (oder ein Unterverzeichnis davon) als Arbeitsverzeichnis hat .