What does ln -T
do? I know the flag does not exist in the BSD version of ln
, and it only exists in the GNU version, and I have read the documentation that it will make ln
"treat LINK_NAME
as a normal file always", but what does that mean and why does the BSD version not have it?
The -T
(--no-target-directory
) option to GNU ln
provides a safety feature that may be useful in scripts.
Suppose that you want to create a new name, $newname
, for a file $filename
, where the new name is maybe provided from external sources.
The command
ln -T "$filename" "$newname"
would then fail if $newname
was an already existing directory, instead of unexpectedly creating the name $filename
inside that directory (which may cause further operations to fail in hilarious ways).
It's a shortcut for something like
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
Likewise, the -t
(--target-directory
) provides a way of ensuring that the new name for the file is actually created inside an existing directory, and nowhere else.
Also, as pointed out by Stephen Kitt in comments, moving the test on the filetype of the target/"link name" into the utility itself may also decrease the risk of being affected by the race condition whereby the target is changed in-between testing for its existence and/or type and actually creating the link.
Why does POSIX or BSD not have -T
or -t
? Well, GNU tool in general have many extensions added that provide convenience. The -T
and -t
options to ln
are some of these. They don't really let you do something that couldn't be done without them, and they don't add functionality. Some systems, like the BSDs, have not even considered adding them, or have considered but rejected the idea of adding them (I don't really know, I can't recall seeing anyone send in a patch to add it on the openbsd-tech
mailing list, for example).
-
Convenience is the key. Your pseudo-code is an apt workaround for the lack of
-T
. And indeed,ln foo bar/
fails ifbar
is neither a directory nor a symlink to a directory. Plus it is slightly more compact to write. – Jim L. Sep 24 '19 at 20:19 -
One benefit of the options is that they allow less racy implementations. – Stephen Kitt Sep 24 '19 at 22:52
ln
has both-t
(--target-directory
) and-T
(--no-target-directory
). You reference both in your question, but I assume that you actually mean only-T
? – Kusalananda♦ Sep 24 '19 at 18:00-T
and-t
have the same purpose inln
,cp
,mv
andinstall
, as explained in the "Target Directory" entry of texinfo manual -- the link is temporary not working, but you can get the same viainfo ln
. – mosvy Sep 24 '19 at 21:46