有什么ln -T
作用?我知道该标志在 BSD 版本中不存在ln
,并且仅存在于 GNU 版本中,并且我已阅读文档,它将ln
“LINK_NAME
始终视为普通文件”,但这是什么意思以及为什么BSD版本没有吗?
答案1
GNU 的-T
( )选项提供了在脚本中可能有用的安全功能。--no-target-directory
ln
假设您要$newname
为文件创建一个新名称$filename
,其中新名称可能是从外部源提供的。
命令
ln -T "$filename" "$newname"
那么会失败if$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
同样,-t
( --target-directory
) 提供了一种方法来确保文件的新名称实际上是在现有目录中创建的,而不是在其他地方创建的。
另外,如指出作者:Stephen Kitt 在评论中,将对目标/“链接名称”的文件类型的测试移至实用程序本身也可能会降低受竞争条件影响的风险,即目标在测试其存在和/之间发生变化。或键入并实际创建链接。
为什么 POSIX 或 BSD 没有-T
或-t
?嗯,GNU 工具一般都有许多添加的扩展提供了方便。-T
和选项-t
就是ln
其中的一些。它们不会真正让您做一些没有它们就无法完成的事情,并且它们不会添加功能。有些系统,比如 BSD,甚至没有考虑过添加它们,或者考虑过但拒绝了添加它们的想法(我真的不知道,我不记得了openbsd-tech
例如,看到有人发送补丁并将其添加到邮件列表中)。