从脚本重命名 bash 脚本的源目录

从脚本重命名 bash 脚本的源目录

我的 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

相关内容