我的 bash 脚本中有以下部分:
# Move to script's source directory (in case it's being called from somewhere else)
cd $(dirname "${BASH_SOURCE[0]}")
# Save script's source directory
pwd=$(pwd)
# If it's not already ~/.cfg
if [ ! "$pwd" -ef ~/.cfg ]; then
echo "Renaming directory"
# Move up one level (since you can't rename directory while in it)
cd ..
# And rename it
mv "$pwd" ~/.cfg
fi
该脚本是 git 存储库的设置脚本,在克隆后立即运行。目的是将整个存储库移动到~/.cfg
。但是,我收到一条错误消息
mv:无法将“/home/user/config”移动到“/home/user/.cfg”:权限被拒绝
权限设置适当,并且mv
从命令行调用相同权限没有任何问题。
我猜问题在于我正在重命名一个目录,而其中的脚本仍在运行,而仅仅通过(如上面的代码片段所示)移出它cd
是不够的。有办法解决这个问题吗?
最后事实证明,我可以做一些比下面接受的答案更简单的事情,尽管本着在最后运行删除的相同精神。
我只是将mv
命令改为cp -r
,然后rm -rf "$pwd"
在脚本的最后添加了 。显然rm
的-f
标志忽略了脚本正在运行的事实。脚本现在可以按预期工作。
答案1
我建议有两个脚本:一个移动所有内容除了第一个脚本,以及仅移动第一个脚本并删除文件夹的脚本。
在第一个脚本的末尾,exec
第二个脚本来自新的位置。这将替换进程并关闭第一个脚本上的句柄。然后第二个脚本可以移动第一个脚本并删除现在为空的原始文件夹。
某物喜欢
# Move to script's source directory (in case it's being called from somewhere else)
cd $(dirname "${BASH_SOURCE[0]}")
# Save script's source directory
pwd=$(pwd)
# If it's not already ~/.cfg
if [ ! "$pwd" -ef ~/.cfg ]; then
echo "Renaming directory"
# Move up one level (since you can't rename directory while in it)
cd ..
# And rename it
for i in "$pwd"; do
if [ "$i" != "${BASH_SOURCE[0]}" ]; then mv "$i" ~/.cfg; fi
done
exec ~/.cfg/script2.sh "${BASH_SOURCE[0]}"
fi
然后脚本2:
#!/bin/bash
# first arg is path to script you call it from.
base=basename "$1"
dir=dirname "$1"
mv "$1" ~/.cfg/$base
rmdir $dir