Я пишу скрипт bash, который перемещает существующий каталог в новое имя, создает новый каталог со старым именем и затем переходит в этот недавно созданный каталог. Как ни странно, новый каталог не пустой, а содержит все из старого, теперь переименованного, каталога. Но перемещение прошло успешно, переименованный каталог существует и содержит то, что он должен содержать. И если я сравниваю inodes, я все еще нахожусь в переименованном каталоге, но имя, указанное с помощью 'pwd', показывает, что я должен быть в новом каталоге.
Чтобы было понятнее, я начинаю с каталога, из которого хочу создать резервную копию. Скрипт по сути делает следующее:
cd <away>
mv <olddir> <olddir>~
mkdir <olddir>
cd <olddir>
Я использую полные пути; использование pushd/popd дает тот же результат. Результат очень странный (test9 — это пустой файл, который я создал, чтобы легко увидеть, нахожусь ли я в ожидаемом каталоге):
/opt/camera_pkg_sdk$ ls -ia1
20578307 .
20447233 ..
20578305 test9
/opt/camera_pkg_sdk$ ls -ia1 ../camera_pkg_sdk
20578306 .
20447233 ..
/opt/camera_pkg_sdk$
Inode 20578307 — это переименованный каталог, 20578306 — новый. Я пробовал вставлять 'sync' в разные места в моем скрипте, но безуспешно. Если в командной строке после запуска скрипта я вручную поднимаюсь на один уровень вверх, а затем обратно, все снова нормально, и я вижу правильные номера inode.
Есть идеи, что попробовать? Как обойти? В чем причина? Или даже есть реальное решение? Мне интересно как то, почему это происходит, так и то, как добиться того, что мне нужно.
решение1
Вы никогда не меняли каталог, пока...
Если в командной строке после выполнения скрипта вручную подняться на один уровень вверх, а затем вернуться назад, то все снова будет нормально.
Вы не можете изменить текущий каталог терминала, запустив другой скрипт обычным способом. Это связано с тем, что скрипты выполняются в подоболочке, которая не влияет на среду родительской оболочки, т. е. на ваш сеанс терминала.
Вам нужноисточникВаш сценарий как:
source script
что также можно сократить как:
. script
чтобы запустить его в той же оболочке.