Повторение описания некоторой личной интерпретации документации POSIX не поможет OP. Есть еще несколько вопросов, которые подробно объясняют POSIX. И все же этот вопрос.
Некоторые основные описания:
A . Известно, что Linux / Unix может стереть файл (каталог) во время его использования. Вот почему вы могли продолжать смотреть фильм после того, как стерли его. Только когда inode записи каталога удаляется, файл действительно исчезает.
В . Также бывает, что оболочка сохраняет внутреннее значение для фактического pwd, даже если значение переменной окружения $ PWD изменяется.
Первый комментарий к принятому ответу @yaegashi показывает, где искать (источник pwd):
Я прав. См. источник
pwd_builtin ()
. Он просто печатает содержимое the_current_working_directory. - yaegashi 31 июля, 16:01
Как показано, оболочка по-прежнему сохраняет информацию о правильном значении pwd ("/ home / user"), даже начиная с нечетного значения PWD.
С . Должно быть легко понять, что значение, хранимое оболочкой, может в некоторых случаях не синхронизироваться с реальностью.
Делаем компакт-диск.
внутри удаленного каталога, похоже, является одним из тех краевых случаев. Также кажется, что оболочка добавляет точку к последнему известному pwd при ошибке.
1 . Удалите каталог для PWD и выполните встроенный pwd.
$ pwd
/tmp/hello
$ rmdir $PWD; pwd
/tmp/hello
Встроенный pwd сообщает значение pwd, которое оболочка сохраняет в памяти.
Внешний / bin / pwd
сообщит об ошибке.
Интересно сообщить, что pwd -P
(даже если он является встроенным для Bash) сообщит об ошибке:
$ pwd -P
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
И после использования встроенной pwd -P
нормальный pwd также не работает. Я считаю, что это потому, что значение pwd в памяти обновляется.
2. cd $ PWD
Затем я попытался перейти в сам каталог, и, конечно же, это было невозможно (хотя я уже был там):
$ cd $ PWD bash: cd: / tmp / hello: такого файла или каталога нет
Любая реальная попытка проследовать по пути к каталогу потерпит неудачу в момент, когда каталог не может быть прочитан (например, когда он не существует).
3. компакт-диск.
Но потом я попробовал с
cd.
, поскольку предполагается, что это то же самое, что и cd $ PWD. И это сработало ... каким-то образом:$ cd. cd: ошибка при получении текущего каталога: getcwd: невозможно получить доступ к родительским каталогам: нет такого файла или каталога
Оболочка пытается получить доступ к пути, который, как он знает, является pwd, и он не работает. И это то, что сообщает оболочка, сбой! Здесь нет проблем.
4. Новый путь.
К моему удивлению, теперь у меня появилось новое "кое-что":
$ pwd / tmp / hello /.
Вылетело значение в памяти для PWD - синхронизации с реальностью, и к нему была добавлена точка (.). Как любое повторное использование cd.
добавит точку.
$ cd .; pwd
/tmp/hello/./.
И совершенно неожиданно, cd ..
сделает pwd и $ PWD только ..
.
$ cd ..; pwd; echo $PWD
..
..
$ cd ..; pwd; echo $PWD
../..
../..
5. Предыдущий PWD.
И если я попытался перейти в предыдущий каталог, это, конечно, не удалось:
$ cd - bash: cd: / tmp / hello: Нет такого файла или каталога
Это так, потому что предыдущее значение PWD (сохраненное в bash в OLDPWD) не могло быть отслежено.
Это было (как вы сообщили выше) / tmp / hello /.
, который (привет, стирается) не может быть отслежен, и вызывает сбой cd -
или cd $ OLDPWD
.
$ echo $OLDPWD # at this point following your exact procedure.
/tmp/hello/.
6. Справочные страницы
Забавно также то, что даже справочная страница не работает, пока там есть:
Справочные страницы работали у меня на этом этапе, ну, фактически, во всех точках.