Ich schreibe ein Bash-Skript, das ein bestehendes Verzeichnis auf einen neuen Namen verschiebt, ein neues Verzeichnis mit dem alten Namen erstellt und dann in dieses neu erstellte Verzeichnis wechselt. Seltsamerweise ist das neue Verzeichnis nicht leer, sondern enthält alles aus dem alten, jetzt umbenannten Verzeichnis. Aber das Verschieben war erfolgreich, das umbenannte Verzeichnis existiert und enthält, was es enthalten soll. Und wenn ich Inodes vergleiche, bin ich immer noch im umbenannten Verzeichnis, aber der mit „pwd“ angegebene Name zeigt, dass ich im neuen Verzeichnis sein sollte.
Um die Dinge klarer zu machen, beginne ich in dem Verzeichnis, aus dem ich ein Backup erstellen möchte. Das Skript macht im Wesentlichen Folgendes:
cd <away>
mv <olddir> <olddir>~
mkdir <olddir>
cd <olddir>
Ich verwende vollständige Pfadnamen. Die Verwendung von pushd/popd führt zum gleichen Ergebnis. Das Ergebnis ist sehr seltsam (test9 ist eine leere Datei, die ich erstellt habe, um einfach zu sehen, ob ich mich im erwarteten Verzeichnis befinde):
/opt/camera_pkg_sdk$ ls -ia1
20578307 .
20447233 ..
20578305 test9
/opt/camera_pkg_sdk$ ls -ia1 ../camera_pkg_sdk
20578306 .
20447233 ..
/opt/camera_pkg_sdk$
Inode 20578307 ist das umbenannte Verzeichnis, 20578306 ist das neue. Ich habe versucht, „sync“ an verschiedenen Stellen in mein Skript einzufügen, aber ohne Erfolg. Wenn ich in der Befehlszeile nach Ausführung des Skripts manuell eine Ebene nach oben und dann zurück gehe, ist alles wieder normal und ich sehe die richtigen Inode-Nummern.
Irgendeine Idee, was ich versuchen könnte? Wie kann ich es umgehen? Was ist der Grund? Oder gibt es überhaupt eine echte Lösung? Mich interessiert sowohl das Warum, als auch eine funktionierende Möglichkeit, das zu erreichen, was ich brauche.
Antwort1
Sie haben das Verzeichnis nie geändert, bis ...
Wenn ich nach Ausführung des Skripts in der Kommandozeile manuell eine Ebene nach oben und wieder zurück gehe, ist alles wieder normal.
Sie können das aktuelle Verzeichnis eines Terminals nicht auf die übliche Weise ändern, indem Sie ein anderes Skript ausführen. Dies liegt daran, dass Skripte in einer Untershell ausgeführt werden, die keine Auswirkungen auf die Umgebung der übergeordneten Shell, d. h. Ihre Terminalsitzung, hat.
Du brauchstQuelleIhr Skript als:
source script
was auch wie folgt abgekürzt werden kann:
. script
um es in derselben Shell auszuführen.