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

Why is this symbolic link created two instances

我有一个用于我的点文件的安装脚本。我正在使用我的主文件夹创建一个目录的符号 links。 links 执行得很好,但创建了第二个符号 link,我无法解释为什么。

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

install.sh
scripts/
    shell.sh
shell/

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

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

$SCRIPTS_DIR 是完整路径

所以我确实在我的主目录中得到了一个 .shell 目录 linked 就好了,但现在我的项目文件夹有一个额外的符号 link

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

任何解释将不胜感激

想一想当你 运行 命令两次 ln -s 当它的目标是目录而不是文件时会发生什么。

如果$HOME/.shell不存在,则

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

...创建它。但是,如果已经存在,那么...

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

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


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

-h If the target_file or target_dir is a symbolic link, do not follow it. This is most useful with the -f option, to replace a symlink which may point to a directory.

因此,如果在 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"