"ln -t" 有什么作用

zac*_*ron 2 linux bsd options ln

有什么作用ln -T?我知道这个标志并不在BSD版存在ln,它只能在GNU版本存在,我有阅读文档,它将使ln“治疗LINK_NAME作为一个正常的文件始终”,但到底是什么意思呢?为什么在BSD版没有吧?

Kus*_*nda 5

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邮件列表中) , 例如)。