неожиданное поведение переименования каталогов в macos (другие варианты posix?) - PullRequest
1 голос
/ 12 ноября 2019

По сути, в Python или bash я могу переименовать каталог с другим именем из этого каталога: в этот момент, внутри каталога, старое имя все еще отображается, но переименование фактически уже произошло.

На макросах с APFS это произошло в скрипте Python, который я писал для переименования каталогов в соответствии с определенным соглашением об именах, которое я использую, и я заметил это поведение.

Я публикую это как posix / shell / macos, так как я наполовину ожидаю, что это произойдет также и в Linux, и я получил такое же общее поведение от zshell.

Допустим, у меня естьdirectory, foo:

(venv) jluc@test$ tree
.
└── foo

Я переименую его в bar с помощью mv foo bar

(venv) jluc@test$ tree
.
└── bar

Но теперь давайте перейдем в этот каталог и выполним переименование.

$cd bar
$pwd
/Users/jluc/kds2/wk/explore/test/bar
$ mv ../bar ../zoom
$ pwd
/Users/jluc/kds2/wk/explore/test/bar  ? still the old name

Итак, теперь, в bar, я переименовал его в zoom. Это не ошибка. Локально, pwd показывает, что я все еще в том же каталоге. Я могу сделать ls, и я не нахожусь в недопустимом каталоге, в который некоторые команды могут когда-нибудь поместить меня.

Однако дерево на один уровень вверх говорит о другом.

(venv) jluc@bar$ tree ..
..
└── zoom  ? but here I see the new name

и cd в текущую директорию не работает

cd `pwd`
-bash: cd: /Users/jluc/kds2/wk/explore/test/bar: No such file or directory

Что, во имя Шредингера, происходит? Обеспечивает ли это схему inode, лежащую в основе файловой системы APFS? Могут ли разные файловые системы, такие как ext4, например, также демонстрировать такое же поведение?

Обновление: если у меня есть отдельный текстовый файл в моем каталоге тестирования, я могу cat содержимое файла до и после локального переименования. , так что это не просто оболочка - файловая система также сотрудничает. Текущий каталог все еще действителен и работоспособен (что будет соответствовать ответу @that другого парня).

1 Ответ

3 голосов
/ 12 ноября 2019

В игре есть две вещи:

  1. В Unix любой дескриптор открытого файла или каталога, как правило, не будет затронут переименованием и удалением.
  2. Оболочка запоминает каталог, в котором вы находитесь, и не выполняет повторный запрос каждый раз.

# 1 означает, что по большей части вы можете удалить или переместитьфайл / dir, который все еще используется, и процесс использования может продолжать использовать его, пока это не будет сделано. # 2 означает, что pwd оболочки будет просто возвращать старое имя (хотя внешний /bin/pwd, который должен запросить, потерпит неудачу).

...