GNU的-T
( --no-target-directory
) 选项ln
提供了可能在脚本中有用的安全功能。
假设你想创建一个新的名字,$newname
为一个文件$filename
,其中的新名字可能来自外部来源提供。
命令
ln -T "$filename" "$newname"
Run Code Online (Sandbox Code Playgroud)
如果是已经存在的目录,则将失败$newname
,而不是$filename
在该目录中意外创建名称(这可能会导致进一步的操作以滑稽的方式失败)。
这是一个快捷方式类似
if [ ! -e "$newname" ]; then
ln "$filename" "$newname"
else
printf 'failed to create hard link "%s": File exists\n' "$newname" >&2
# Further code to handle failure to create link here.
fi
Run Code Online (Sandbox Code Playgroud)
同样,-t
( --target-directory
) 提供了一种方法来确保文件的新名称实际上是在现有目录中创建的,而不是在其他任何地方。
此外,正如Stephen Kitt 在评论中指出的那样,将针对目标/“链接名称”的文件类型的测试移至实用程序本身也可以降低受竞争条件影响的风险,即在测试之间更改目标因其存在和/或类型以及实际创建链接。
为什么 POSIX 或 BSD 没有-T
或-t
?好吧,GNU 工具通常添加了许多扩展以提供便利。在-T
和-t
选项ln
是其中的一些。它们不会真正让您做一些没有它们就无法完成的事情,并且它们不会添加功能。有些系统,比如 BSD,甚至没有考虑过添加它们,或者已经考虑过但拒绝了添加它们的想法(我真的不知道,我不记得看到有人发过补丁来将它添加到openbsd-tech
邮件列表中) , 例如)。