Вполне возможно, что такая аберрация может быть создана, если кто-то сказал
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("..") завершится неудачно, оболочка вычислит то, что, по ее мнению, должен быть каталог следующего уровня, и перейдет туда абсолютно.
(Но я подозреваю, что это еще не все.)