Вполне возможно, что такая аберрация может быть создана, если кто-то сказал
mkdir /tmp/strange_dir
в то время, когда файловая система была заполнена (т. е. свободных блоков не было).
Было бы еще (возможно) было возможно создать запись каталога strange_dir
в /tmp
поскольку это потребует лишь несколько байт неиспользуемого пространства в одном из блоков , уже выделенных в /tmp
Но было бы невозможно выделить блок для самого strange_dir
, и, следовательно, было бы невозможно создать .
и ..
записи. В таком случае, я бы ожидать , что программа mkdir
удалить (разъединить) запись каталога strange_dir
в /tmp
но программное обеспечение не всегда делать то , что я ожидал.
Другие возможности:
mkdir
был прерван (прекращено) между созданием записи каталога strange_dir
в /tmp
и .
и ..
записи в strange_dir
.
Я ожидал бы, что mkdir
поймает сигнал прерывания (т.е. Ctrl+C) и очистит после себя, но смотри выше относительно программного обеспечения и моих ожиданий от него.
И, конечно, он не может поймать сигнал уничтожения или сбой системы.
rmdir
был прерван (прерван) между отменой связи .
и ..
записи в strange_dir
и разрыве связей записи каталога strange_dir
в /tmp
Можно было бы ожидать, что fsck
который запускается после сбоя, обнаружит strange_dir
и что-то с этим сделает, но ....
Да, конечно, если каталог имеет размер 0, это означает, что у него нет выделенных ему блоков, и поэтому он не может иметь никакого содержимого (даже таких маленьких, как .
И ..
).
Я не совсем понимаю, почему cd ..
будет работать, когда нет ..
, но см. Обсуждение в разделе Удаление каталога изнутри с помощью интерфейса командной строки. Оказывается, что
mkdir /tmp/strange_dir
cd /tmp/strange_dir
ls -lai ← Shows normal . and .., with inode numbers.
rmdir /tmp/strange_dir
pwd ← Still reports /tmp/strange_dir
ls -lai ← Shows empty directory: Total 0
ls -ldi ← Shows . with the same inode number it had before,
but with a size of 0 and a link count of 0.
cd .. ← Puts you back into /tmp
Эта ситуация не совсем аналогична ситуации в этом вопросе, потому что в этом другом случае strange_dir
удаляется из /tmp
.
Но это говорит о том, что cd ..
является особенным, и иногда работает, когда нет очевидного механизма, с помощью которого он мог бы.
Странное различие между pwd и /bin /pwd предполагает возможность того, как это может работать. Оболочка отслеживает ваш текущий каталог.
То есть он отслеживает лучшее предположение о том, какой у вас текущий каталог.
Это может быть одурачено символическими ссылками и трюками, такими как
mkdir /tmp/foo
cd /tmp/foo
mv /tmp/foo /tmp/foobar
т. е. он по-прежнему будет думать, что текущим каталогом является /tmp/foo
, и именно поэтому pwd
сообщит, но pwd -P
и /bin/pwd
сообщат /tmp/foobar
.
Таким образом, может случиться так, что если chdir("..")
завершится неудачно, оболочка вычислит то, что, по ее мнению, должен быть каталог следующего уровня, и перейдет туда абсолютно.
(Но я подозреваю, что это еще не все.)