it-swarm.com.de

Hat cd. Verwendung haben?

In einem der Tutorials, denen ich kurz gefolgt bin, wurde festgestellt, dass cd . Keine Verwendung hat. Beim Versuch, das von OP in Symbolische Linkrekursion angezeigte Problem zu replizieren - was macht es "zurücksetzen"? , habe ich auch cd . Versucht, welches zeigten den gleichen beschriebenen OP-Effekt (wachsende Variable $PWD), dem mit cd -P entgegengewirkt werden kann.

Ich frage mich daher, ob es einen Fall gibt, in dem man tatsächlich cd . Verwenden möchte.

102

Ich denke, das überdenkt das Problem. cd . Ist vielleicht nicht etwas, das man manuell im üblichen Verlauf ausführen würde, aber es ist definitiv etwas, das bei der programmatischen Ausführung auftreten kann (denken Sie an jede Situation, in der Sie cd zum Verzeichnis mit einer Datei, deren Pfad vom Benutzer angegeben wird). Daher muss es nicht speziell verwendet werden: Solange es die übliche Semantik von cd <some-path> Erfüllt, ist es nützlich.

157
Olorin

Der Pfad des Verzeichnisses könnte sich geändert haben, seit der letzte Befehl ausgeführt wurde, und ohne cd . Verlassen sich die Bash- und ksh93-Shells auf das logische Arbeitsverzeichnis, das in dem in der Frage verlinkten Beitrag beschrieben ist. Rufen Sie daher cd ., wodurch die Shell den getcwd() syscall ausgibt, wird sichergestellt, dass Ihr aktueller Pfad weiterhin gültig ist.

Schritte zur Reproduktion in Bash:

  1. In einem Terminal Tab Issue mkdir ./dir_no_1; cd ./dir_no_1
  2. In einem anderen Terminal Tab Problem mv dir_no_1 dir_no_2
  3. Auf der ersten Registerkarte des Terminals geben Sie echo $PWD Und pwd aus. Beachten Sie, dass das Verzeichnis extern umbenannt wurde. Die Umgebung der Shell wurde nicht aktualisiert.
  4. Ausgabe cd .; pwd; echo $PWD. Beachten Sie, dass der Wert aktualisiert wurde.

ksh93 aktualisiert jedoch nicht die Umgebungsinformationen, sodass cd . in ksh93 möglicherweise tatsächlich nutzlos ist. In /bin/dash Unter Ubuntu und anderen Debian-basierten Systemen gibt cd . Den Fehler dash: 3: cd: can't cd to . Zurück, jedoch funktioniert cd -P . (Anders als in ksh93).

127

Ein 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:

  1. Erstellen Sie ein Verzeichnis temp
  2. cd temp und dann mache ein ls
  3. Öffnen Sie ein anderes Terminal, löschen Sie das Verzeichnis und erstellen Sie es neu. temp
  4. Versuchen Sie vom ersten Terminal aus, ein ls zu machen. Dies würde zu einem Fehler führen - ls: cannot open directory .: Stale file handle
  5. cd . und dann ein ls zu machen funktioniert gut
55
Sahil Agarwal

Sie können $OLDPWD Mit einem schnellen cd . Löschen, falls es einen Fall geben sollte, in dem Sie nicht möchten, dass er auf eine "interessante" Stelle zeigt. Dies wirkt sich auch auf cd - Aus.

36
nperson325681

Programmatisch ist es als No-Op nützlich. Betrachten Sie einen Pfad, der von einem externen Eingang bereitgestellt wird.

read -p "Path to file: " p
dirn=$(dirname "$p")
file=$(basename "$p")
echo "dirn=$dirn, file=$file"
cd "$dirn"
ls -ld "$file"

Bei einem Pfad wie "fred.txt" wird das Verzeichnis zu ., Was zu cd . Führt.

16
roaima

Dies ist häufig der Fall, wenn Sie mit einem fehlerhaften USB-Kabel arbeiten mussten. Nachdem ein Gerät getrennt und erneut verbunden und automatisch in dasselbe Verzeichnis eingebunden wurde, müssen Sie cd . Verwenden, damit es wieder funktioniert.

15
user23013

Beachten Sie, dass "." is der richtige Weg, um den Namen der Datei anzugeben, die als aktuelles Arbeitsverzeichnis eines Prozesses geöffnet ist (einschließlich eines Shell-Prozesses natürlich), 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" wurde, z. B. ein veraltetes NFS-Handle). Es ist jedoch ein gültiger Name einer Datei, die garantiert in jedem gültigen Verzeichnis vorhanden ist.

. muss also ein gültiges Argument für jeden Befehl sein, der den Namen eines Verzeichnisses akzeptiert, und somit in der Standard-Shell cd . Muss ein gültiger Befehl sein.

Ob cd . Nützlich ist oder nicht, hängt von der Shell-Implementierung ab. Wie bereits erwähnt, kann es nützlich sein, wenn die Shell nach dem Aufruf des zugrunde liegenden Systemaufrufs chdir ihre interne Vorstellung vom vollständigen Pfadnamen des aktuellen Arbeitsverzeichnisses zurücksetzt, z. B. wenn das zugrunde liegende Verzeichnis (oder ein übergeordnetes Verzeichnis davon) dies hat wurde umbenannt.

Zumindest einige mir bekannte Shells (/bin/sh Unter FreeBSD und NetBSD) konvertieren cd "" In cd ., Was wohl als eine Funktion zur Unterstützung der programmatischen Verwendung in einem Shell-Skript beschrieben werden kann Eine Variable kann als Parameter verwendet werden (dh eine leere Variablensubstitution in ein "Nichtstun" -Ergebnis konvertieren), 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 von chdir("") zu verhindern. , welche POSIX-Mandate fehlschlagen müssen.

Einige andere Shells ersetzen den . Durch das, was sie als vollqualifizierten Pfadnamen in ihrem aktuellen Arbeitsverzeichnis gespeichert haben, und daher kann dies für sie das in Sahil Agarwals Antwort erwähnte Verhalten zulassen .

11
Greg A. Woods

Ich habe diesen Befehl erst heute verwendet, als ich den Zweig, an dem ich in Git gearbeitet habe, aus einem Verzeichnis heraus neu basiert habe, das zuerst in demselben Zweig erstellt wurde. Die Rebase ging gut, aber danach git status warf einen Fehler. Nach cd . alles war normal.

(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 der Fall.)


Ich habe diesen Befehl auch in Verzeichnissen verwendet, die durch einen automatisierten Prozess aktualisiert werden, bei dem das alte Verzeichnis beiseite geschoben und durch ein neues ersetzt wird (damit es so nah wie möglich an atomar ist). Keine alltägliche Situation, aber cd . ist genau das, was benötigt wird.


Nach dem Lesen dieser ausgezeichneten Antwort von Stephane Chazelas:

Ich verstehe jetzt, dass meine obigen Anwendungsfälle nur funktionieren, weil ich bash verwende, in dem cd . ist äquivalent zu cd "$PWD". Ich empfehle dringend, die verknüpfte Antwort zu lesen.

4
Wildcard

Ich benutze cd . um das Zeug, mit dem ich cd überladen habe, über eine bash Funktion erneut auszuführen.

Von meinem ~/.bashrc:

# from the "xttitle(1)" man page - put info in window title
update_title()
{
    [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]]  && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD"
}

cd()
{
    [[ -z "$*" ]] && builtin cd $HOME
    [[ -n "$*" ]] && builtin cd "$*"
    update_title
}
1
waltinator

EDIT: Dies wurde bereits zuvor von Sahil 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:

$1 mkdir d
$1 cd d
$1 touch f

$2 rm -rf /path/to/d # delete the folder where $1 is in ...
$2 mkdir /path/to/d # ... and recreate it

$1 touch g # cannot create file g because current dir doesn't exist anymore
touch: cannot touch ‘g’: Stale file handle
$1 cd . # go to the newly created dir (same path)
$1 touch g # works fine now

Ich bin nicht sicher, ob genau wo (Betriebssystem, Shell, ...?) Die Hauptursache für dieses Verhalten liegt.

0
Rolf