我有一个用于我的点文件的安装脚本。我用来创建一个目录到我的主文件夹的符号链接。这些链接执行得很好,但创建了第二个符号链接,我无法解释为什么。
项目中的文件夹结构如下所示
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/
任何解释将不胜感激
想一想当ln -s命令的目标是目录而不是文件时运行该命令两次会发生什么。
如果$HOME/.shell不存在,那么
ln -s "$SCRIPTS_DIR/shell/" "$HOME/.shell"
...创建它。但是,如果它已经存在,那么......
ln -s "$SCRIPTS_DIR/shell/" "$HOME/.shell"
...视为.shell目标目录名称,而不是要创建的目标的完整路径,并在该目录中创建一个新条目。
GNUln有一些扩展来修复这种用法,包括:
-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"