Shell merkt das Verschieben vom aktuellen Ordner nicht

Beim arbeiten mit der ‚bash‘ kann man auf nette effekte Stoßen, deren Folgen mitunter zum Haare raufen sind. In diesem Beitrag möchte ich das Verhalten beim Verschieben von Ordnern erklären bzw. die Effekte darstellen.

Ich habe folgendes Szenario: In meinem Home-Verzeichnis (/home/carshaker) habe ich ein Verzeichnis „test1“. Ich befinde mich mit einem Terminal (/dev/pts/1) in diesem Verzeichnis. Wie in der nachfolgenden Abbildung gezeigt, ergibt der Aufruf von „pwd“ (1) auch meinen aktuellen Standort: /home/carshaker/test1.

Verschieben des aktuellen Ordners
Verschieben des aktuellen Ordners

Nun verschiebe ich wie unter (2) dargestellt das aktuelle Verzeichnis nach „/tmp/“. Doch ein unmittelbarer Aufruf von „pwd“ (3) zeigt mir an, dass ich mich unter /home/carshaker/test1 befinde. Dieses Verzeichnis dürfte es jetzt aber gar nicht mehr geben. Ein Test, ob das verschobene Verzeichnis unter „/tmp/“ liegt, wird mit „ls -l /tmp/test1“ (4) erfolgreich ausgegeben.

Dies kann jetzt zu ungewünschten Effekten kommen, wenn man denkt, man befindet sich noch in einem Verzeichnis unter dem Homeverzeichnis. Es ist nämlich jetzt durchaus möglich Dateien z.B. mittels Vim zu erzeugen. Diese werden aber nicht unter /home/carshaker/test1 sondern unter /tmp/test1 angelegt.

Die aktuelle Shell – also der Prozess der bash – führt nach dem move-Befehl keine erneute Überprüfung der Inode durch. Solange kein neuer Prozess geforkt wird, „sieht“ man also nicht, dass das Verzeichnis nicht mehr da ist bzw. an einem anderen Ort liegt.

Wieso zeigt „pwd“ jetzt noch den flaschen Ort/Ordner an? Eine Lösung bietet die Überprüfung des Befehls:

type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

Das Kommando „pwd“ gibt es mehrmals auf dem System. Einmal als ein Shell-internes Kommando, einmal extern. Daher ergibt sich auch folgender Unterschied:

carshaker@darkroom:~/test1$ pwd
/home/carshaker/test1
carshaker@darkroom:~/test1$
carshaker@darkroom:~/test1$ /bin/pwd
/tmp/test1
carshaker@darkroom:~/test1$

Erst durch den Aufruf des „externen“ Programms, durch das forken eines neuen Prozesses, wird due Inode erneut geprüft und das „richtige“ Verzeichnis ausgegeben.
Immer wieder lustig – die Shell 😉

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Bitte folgende kleine Aufgabe lösen: * Time limit is exhausted. Please reload CAPTCHA.