Bash脚本运行意外生成未指定自引用软链接问题排查
异常产生原因
问题出在脚本中软链接创建语句的默认执行逻辑,和重复运行脚本时的行为冲突:
- 脚本每次运行都会无条件执行
ln -s ${workdir} work,没有提前判断目标软链接是否存在。首次运行时$homedir下没有work条目,命令会正常创建指向$workdir的软链接,符合预期。 - 第二次及之后运行脚本时,
$homedir下已经存在名为work的软链接,且该链接指向的$workdir是有效目录。此时ln命令默认不会覆盖原有软链接,反而会将待创建的软链接放到这个已存在的目录内部,软链接的文件名自动取源路径的basename——也就是grids,链接目标就是传入的$workdir路径,最终就生成了$workdir/grids这个指向目录自身的异常软链接。 - 所谓“删除链接会连带删除所有输出文件”,是操作时误给链接路径加了尾部斜杠导致的:比如执行
rm grids/时,系统会顺着软链接进入指向的$workdir目录内部执行删除,自然会删掉目录下的所有文件,本质不是删链接导致的文件丢失。
修复方法
调整软链接创建逻辑即可,两种常用改法任选其一:
- 给ln命令加
-snf参数,强制按普通文件逻辑处理已存在的目录软链接,直接覆盖,不会进入链接指向的目录创建新条目:
ln -snf ${workdir} work
参数说明:-n将指向目录的软链接视为普通文件,不进入目录内部;-f强制覆盖已存在的同名条目。
2. 创建软链接前先做存在性判断,仅当链接不存在时才执行创建:
if [ ! -e "$homedir/work" ]; then ln -s ${workdir} "$homedir/work" fi
额外注意:后续删除软链接时不要在路径末尾加斜杠,直接执行rm grids就只会删除链接本身,不会影响目标目录内的文件。
内容的提问来源于stack exchange,提问作者Yue Tian
相关产品推荐
相关产品推荐

