我有一个用于我的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/
任何解释都将不胜感激
答案 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"