Eu costumava ln
escrever links simbólicos por anos, mas ainda recebo a ordem dos parâmetros errados.
Isso geralmente me faz escrever:
ln -s a b
e, em seguida, olhando para a saída para me lembrar.
Sempre imagino ser a -> b
como leio quando na verdade é o contrário b -> a
. Isso parece contra-intuitivo, então acho que estou sempre me questionando.
Alguém tem alguma dica para me ajudar a lembrar a ordem correta?
Eu digo "
ln
é comocp
. A 'fonte' precisa vir primeiro."Eu uso o seguinte:
ln
tem um formulário de um argumento (2º formulário listado na página de manual ) no qual apenas o destino é necessário (porque como poderialn
funcionar sem conhecer o destino) eln
cria o link no diretório atual. A forma de dois argumentos é uma adição à forma de um argumento, portanto, o alvo é sempre o primeiro argumento.A maioria dos Unices documenta o
ln
comando como(Estou omitindo opções etc. aqui)
Exemplos:
O padrão POSIX
OpenBSD :
NetBSD e FreeBSD
Mac OS
Solaris
AIX
O manual GNU
ln
é o estranho e chama osource
destino e o nome dotarget
link .Manual GNU para
ln
Ignorando a escolha de palavras do GNU, o
ln
utilitário segue a mesma semântica que, por exemplo,mv
ecp
em que o destino é o que é criado a partir da fonte .Portanto,
criaria o link simbólico
b
apontando paraa
. Ou seja,b
é o alvo da operação que cria um link simbólico usandoa
como fonte.Observe que ao criar links simbólicos , a fonte é simplesmente uma string representando o que o link simbólico deve apontar. Geralmente, não há verificação feita para validar que aponta para algo útil:
Um pensamento pessoal sobre a escolha do GNU de usar "target" e "link name" em vez de "source" seguido de "target":
Pode parecer óbvio que o segundo argumento, a coisa que é criada, deve ser o "nome do link" e que o primeiro argumento, o destino do link, é "destino". No entanto, isso só é verdade quando você usa o link.
Quando você cria o link, que é o que você está fazendo com
ln
, o segundo argumento, o que é criado, é o "destino" daln
operação, e é criado usando o primeiro argumento, a "origem".Isso, junto com a ordenação análoga "fonte"->"destino" de argumentos para outras ferramentas básicas, faz com que a documentação não-GNU
ln
pareça mais natural.Recentemente, ouvi uma ótima maneira de lembrar essa coisa em particular: uma rima
O primeiro verso é quais são os argumentos de ln: algo antigo seguido por um nome da nova entrada do diretório.
Caso isso ajude alguém: eu me acostumei a pensar nisso como "ln what where ", o que me ajuda a lembrar que o primeiro argumento ("what") é o arquivo existente, o segundo ("where") é o local para colocar (um link para) ele. Ao contrário do raciocínio na maioria das outras respostas, isso nada mais é do que uma frase concisa que posso recitar mentalmente para mim mesmo enquanto digito um comando, que serve como auxiliar de memória. Isso provavelmente não será útil para todos, mas suspeito que ajudará algumas pessoas.
Ajuda que os outros comandos de manipulação de arquivos padrão usem a mesma convenção, para que eu possa fazer o mesmo para
cp
emv
.De 1971 Manuais Unix Primeira Edição .
Existe uma segunda forma de sintaxe simples.
Eu coloco FILE ou FILENAME em vez de TARGET --- veja comentários etc. Veja também adição muito longa na parte inferior, abordando o iceberg, duro e mole de
ln
, não apenas a ponta dele.Então o GNU
ln
tem isso:onde você não precisa do nome do link. Depois
ln -s /usr/lib/modules
de obter umcom o mesmo nome de FILENAME ("destino" ou "origem"), exatamente onde você está. Sem escolha, sem confusão.
Agora, se você for mais exigente e quiser que o link seja criado com outro nome e/ou outro lugar , adicione esse desejo como nome ou caminho. O alvo real vem em primeiro lugar, o novo nome de link extra sofisticado em segundo lugar.
Ou você diz: "Eu conheço essa notação de seta
ls -l
para links. Eu não tenho uma seta no shell para mostrar a direção do meu link. Então eu tenho que dar a volta por cima."Você a cria em uma direção, para que possa usá-la na outra.
(FIM DA PARTE RESPOSTA À PERGUNTA)
Em outro nível, a própria palavra "link" carrega um duplo significado profundamente oculto. Links simbólicos vieram mais tarde, então nos primeiros dias um link era apenas um link. Não havia macio e duro, não havia
-s
opção. E agora até uso o simbolismo fonte-alvo:Nesta fase, existem links, mas não hard e soft, e
ls -l
não apresenta setas, pois não há direção em um link (hard). Um "link" nesse estágio de evolução do unix significava que o nome de arquivo "B" (entrada de diretório "B") no sistema de arquivos aponta para o mesmo inode que o nome de arquivo "A" está apontando.Os arquivos A e B estão "vinculados" entre si, pois compartilham os mesmos blocos. Então agora com cada
rm
, o kernel tem que verificar: eu apago/libro os blocos deste arquivo no disco, ou existe outro arquivo vinculado aos mesmos blocos? Para isso, é utilizado um contador de links.Digamos que você queira evitar que um arquivo grande em /tmp seja excluído e faça
ln /tmp/bigfile
. Agora você tem um grande arquivo grande em seu diretório de trabalho. Depois de limpar /tmp e remover o "original", você continua usando os mesmos blocos de dados. Você não recebe um link morto ou pendente, você tem um arquivo normal. Apontando para nenhum arquivo, mas apenas blocos do sistema de arquivos, como todas as entradas de diretório. Só que agora "limpar" /tmp não é tão eficaz quanto era. Parece vazio, e é, mas os blocos na partição não são liberados.Mesmo que um link físico não custe espaço em si
cp
, ele pode indiretamente.Adicionando
ln -s
à sequência acima:Agora "B", o soft link, tem apenas uma string com um nome de caminho. Esta é uma informação "suave". Tecnicamente "A" e "B" não estão relacionados. Mas ainda B é um "link" no novo sentido de que você pode usar esse nome de caminho armazenado como um atalho para "A". Agora é "um link para A" (ponto) e não "vinculado ao inode do arquivo A"
Ambos os tipos de links podem confundir não apenas os humanos, mas também o kernel/fs. A página de manual de 1971 observa: "BUGS: links são copiados duas vezes e restaurados como arquivos separados com inodes separados."
Links físicos para diretórios (raros/não permitidos) podem facilmente levar a um entupimento.
Soft links para diretórios (muito comuns) podem levar a loops eternos - estes precisam ser reconhecidos por utilitários/kernel.
Exemplo prático no bash
Começando com um arquivo normal "F"...
...faz com que Fhard tenha o mesmo tamanho de F, mas ambos aparecem agora em vermelho escuro SEM setas em
ls -l --color
. Porstat
mostrar "Links: 2" em conexão com "Inode: xyz". O hard linking F transforma o próprio F em um hard link. Ambos são/permanecem o tipo de arquivo "arquivo regular". Mas ambos têm um inode com uma contagem de links acima de 1....faz um pequeno arquivo "não regular" "Fsoft" com o tipo de arquivo "link simbólico" --- economizando ainda mais espaço do que um diretório vazio. A
ls -l
não mostra nada de especial para "F". Para Fsoft, o tamanho mostrado é de 1 byte, pois a string é 'F' eFsoft -> F
é exibida como nome. Não há necessidade de colorir um soft link para reconhecê-lo, porque na forma abreviadals -F
você obtém uma corrente enrolada@
anexada:Fsoft@
Com
ls -l
ele fica assim:Fhard tem tamanho e tipo de F.
Fsoft tem o nome de F e o comprimento do nome de F como tamanho e um tipo de arquivo diferente.
Curto
ls -sF
:a adição
--block-size=1
também não produz os mesmos tamanhos. Fsoft tem tamanho "um byte, zero blocos". F e Fhard se desviam em paralelo:Para ver se o Fsoft está pendurado ou não,
ls
permite usar cores.É muito útil lembrar que o nome do link é opcional. Se não for fornecido, o nome base do destino do link será usado.
é idêntico a descartar completamente o nome do link:
Isso não faria sentido se o destino do link fosse mencionado por último.
Basta pensar em Unix -> AT&T -> destino à direita:
Semelhante ao cp, que eu li mentalmente como “copiar isso para aquilo”, eu li os comandos ln como “vincule isso a aquilo”.
Pessoalmente, prefiro evitar lembrar de X, em favor de saber onde procurar X quando preciso. Também sou fã da atitude "melhor prevenir do que remediar", então sempre gosto de verificar cuidadosamente o que estou escrevendo, especialmente como root.
Nesse caso, a resposta está literalmente nas primeiras linhas da página de manual:
Eu não teria sugerido isso se fosse necessário mergulhar na página de manual, mas como está bem no início, IMHO vale a pena os 3 segundos necessários para digitar
man ln
e sair.