Bash脚本安全地创建符号链接?

时间:2010-08-08 15:52:03

标签: bash symlink

我正在尝试将所有配置文件配置文件(〜/ .xxx)存储在git中。我对bash脚本非常可怕,但我想这对于你的脚本专家来说非常简单。

基本上,我想要一个脚本,它会在我的主目录中创建符号链接到我的仓库中的文件。 Twist是,如果符号链接将覆盖实际文件,我想它会警告并提示覆盖。它还应该提示是否要覆盖sym链接,但目标路径是不同的。

我不介意为我想要创建的每个链接手动编辑脚本。我更关心能够通过运行存储在我的仓库中的脚本来快速部署新的配置脚本。

有什么想法吗?

2 个答案:

答案 0 :(得分:14)

ln命令对于擦除已经很保守了,所以也许KISS方法对你来说足够好了:

ln -s git-stuff/home/.[!.]* .

如果文件或链接已存在,您将收到错误消息,此链接将被跳过。

如果您希望文件在存储库中具有不同的名称,请将-n选项传递给ln,以便它不会在该名称的现有子目录中意外创建符号链接:< / p>

ln -sn git-stuff/home/profile .profile
...

如果您还希望在主目录的子目录中包含链接,cp -as将重现目录结构,但会为常规文件创建符号链接。使用-i选项,它会提示目标是否已存在。

cp -i -as git-stuff/home/.[!.]* .

(我的回答假定GNU ln和GNU cp,例如您在Linux(和Cygwin)上找到但通常不在其他unices上。)

答案 1 :(得分:1)

以下是竞争条件,但它可能与没有文件系统事务的情况一样安全:

# create a symlink at $dest pointing to $source
# not well tested
set -e   # abort on errors
if [[ ( -h $dest && $(readlink -n "$dest") != $source ) || -f $dest || -d $dest ]]
then
    read -p "Overwrite $dest? " answer
else
    answer=y
fi
[[ $answer == y ]] && ln -s -n -f -v -- "$source" "$dest"