我正在编写一个 bash 脚本,将现有目录移动到新名称,使用旧名称创建新目录,然后切换到新创建的目录。奇怪的是,新目录不是空的,而是包含旧目录(现已重命名)中的所有内容。但移动成功,重命名的目录存在并包含它应包含的内容。如果我比较 inode,我仍然在重命名的目录中,但用“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
您从未改变过目录直到...
如果在脚本运行后的命令行上,我手动上升一级然后再返回,一切就都正常了。
您无法通过以常规方式运行另一个脚本来更改终端的当前目录。这是因为脚本是在子 shell 中执行的,而子 shell 对父 shell 的环境(即您的终端会话)没有影响。
你需要来源你的脚本为:
source script
也可以缩写为:
. script
在同一个 shell 中运行它。