Estou atualizando minha compreensão de alguns comandos básicos do GNU/Linux que, admito, nunca entendi completamente nos últimos 20 anos.
$ man ln
em parte diz:
-n, --no-dereference
treat LINK_NAME as a normal file if it is a symbolic link to a directory
Para tentar entender isso melhor, eu dividi isso da seguinte forma:
$ mkdir dir1
$ ln -vs dir1 dir2
'dir2' -> 'dir1'
$ mkdir dir3; touch dir3/xx
$ tree -F
.
├── dir1/
├── dir2 -> dir1/
└── dir3/
└── xx
# Now to test -n, first as a hard link
$ ln -vn dir3/xx dir2
ln: failed to create hard link 'dir2': File exists
# and second as a symbolic link
$ ln -vsn dir3/xx dir2
ln: failed to create symbolic link 'dir2': File exists
# ??? why do these both fail ???
Apenas o primeiro formulário de comando na SINOPSE chama um 'LINK_NAME', nesta sintaxe:
ln [OPTION]... [-T] TARGET LINK_NAME
Portanto, isso diz que as opções -n
e SOMENTE se relacionam ao primeiro formulário de comando para , (e não aos outros três formulários de comando).--no-dereference
ln
No meu exemplo:
O TARGET é dir3/xx
, e
o LINK_NAME é dir2
('um link simbólico para um diretório').
O manual diz que se LINK_NAME ( ou seja, lembre-se que este é o nome do link que supostamente estamos criando ) é ' um link simbólico para um diretório '...
... então devemos tratar este link simbólico como um ' arquivo normal '.
o que estou perdendo?
Sem
-n
, ambos osln
comandos criariam links dentro dedir2
: seLINK_NAME
existir e for um diretório ou um link simbólico para um diretório, o link será criado dentro do diretório (se possível).Isso é o que
-n
muda aqui:ln
não será consideradoLINK_NAME
um diretório (se for um link simbólico). ComoLINK_NAME
já existe,ln
falha. A adição-f
fará com que o link simbólico existente seja substituído:substituirá
dir2
em vez de criar um link dentro dedir2
.