为什么这个符号链接创建了两个实例

时间:2015-05-26 23:11:52

标签: bash zsh

我有一个用于我的dotfiles的安装脚本。我用来创建一个目录到我的主文件夹的符号链接。链接执行得很好,但是创建了第二个symobolic链接,我无法解释原因。

项目中的文件夹结构如下所示

install.sh
scripts/
    shell.sh
shell/

install.sh调用shell.sh并调用命令

ln -s $SCRIPTS_DIR/shell/ $HOME/.shell

$ SCRIPTS_DIR是一个完整路径

所以我的主目录中的.shell目录链接得很好,但现在我的项目文件夹有一个额外的符号链接

install.sh
scripts/
    shell -> PATH_TO_PROJECT/shell
    shell.sh 
shell/

任何解释都将不胜感激

1 个答案:

答案 0 :(得分:3)

考虑当你的目标是目录而不是文件时运行ln -s命令时会发生什么。

如果$HOME/.shell不存在,那么

ln -s "$SCRIPTS_DIR/shell/" "$HOME/.shell"

...创造它。但是,如果已经,那么......

ln -s "$SCRIPTS_DIR/shell/" "$HOME/.shell"

...将.shell视为目标目录名称,而不是要创建的目标的完整路径,并在该目录中创建新条目

GNU ln有一些扩展来修复此用法,包括:

  

-h如果target_file或target_dir是符号链接,请不要遵循它。这对于-f选项最有用,用于替换可能指向目录的符号链接。

因此,如果在GNU系统上运行,您可以使用:

# quotes added for bash compatibility, since question is tagged for both shells
ln -sfh "$SCRIPTS_DIR/shell/" "$HOME/.shell"

否则,请先检查:

[[ -e $HOME/.shell ]] || ln -s "$SCRIPTS_DIR/shell/" "$HOME/.shell"