Eu costumava ln
escrever links simbólicos há anos, mas ainda assim a ordem dos parâmetros estava errada.
Isso geralmente me faz escrever:
ln -s a b
e depois olhando a saída para me lembrar.
Eu sempre imagino ser a -> b
como eu 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?
a
e chamab
"ln source target
. Mesmo quecp source target
,mv source target
; ...Respostas:
Eu uso o seguinte:
ln
possui uma forma de argumento único (segunda forma listada na página de manual ) na 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 destino é sempre o primeiro argumento.fonte
ln
.-t
), parece quase uma prova. "ln
cria o link no diretório atual. O formulário de dois argumentos é uma adição ao formulário de um argumento e, portanto, o destino é sempre o primeiro argumento". Como faz sentido que esse seja o caso ao considerar a segunda forma, acho que isso me ajudará a lembrar.Eu digo "
ln
é comocp
. A 'fonte' precisa vir em primeiro lugar".fonte
mv
.mv
,cp
eln
todos tomam um arquivo existente como primeiro argumento e o nome do arquivo ou diretório de destino pretendido como segundo argumento.memcpy
,strcpy
etc. , funcionem ao contrário.memcpy(dest,src,n);
mapas muito bem paradest = src;
. Em outras palavras, defina (os primeirosn
bytes de) dest igual a (os primeirosn
bytes de) src.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
ln
manual GNU chama osource
alvo e otarget
nome do link .Manual GNU para
ln
Ignorando a escolha de palavras do GNU, o
ln
utilitário segue o mesmo tipo de 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
.Observe também que, ao criar links simbólicos , a fonte é simplesmente uma string que representa para onde o link simbólico deve apontar. Geralmente, não é feita nenhuma verificação para validar se aponta para algo útil:
fonte
ln -s a b
funciona, e isso não tem nada a ver com a redação do GNU, pois acho que nunca vi o fraseado na página de manual. : D (é mais fácil executar apenasln -si a b
quando não tiver certeza, ele reclamará seb
já existir.)Caso isso ajude alguém: eu me acostumei a pensar nisso como "em que lugar ", o que me ajuda a lembrar que o primeiro argumento ("o que") é o arquivo existente, o segundo ("onde") é o lugar colocar (um link para). 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 mesma enquanto digito um comando, que serve como auxílio à memória. Provavelmente isso não será útil para todos, mas suspeito que isso ajude 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 por
cp
emv
.fonte
Recentemente, ouvi uma ótima maneira de lembrar essa coisa em particular: uma rima
O primeiro verso é o que os argumentos de ln são: algo antigo seguido de um nome da nova entrada de diretório.
fonte
Desde 1971 Unix First Edition Manuais .
Há uma segunda forma simples e simples de sintaxe.
edit: eu coloquei ARQUIVO ou ARQUIVO em vez de TARGET --- ver comentários etc. ver também muito disso na parte inferior, abordando o iceberg, duro e mole de
ln
, não apenas a ponta do mesmo.Então o GNU
ln
tem isso:onde você não precisa do nome do link. Depois de
ln -s /usr/lib/modules
obter umcom o mesmo nome que FILENAME ("destino" ou "origem"), exatamente onde você está. Sem escolha, sem confusão.
Agora, se você é mais exigente e deseja que o link seja criado com outro nome e / ou outro local , adicione esse desejo como nome ou caminho. O alvo real vem em primeiro lugar, a fantasia extra, o novo nome do link, em segundo.
Ou você diz: "Conheço essa notação de flecha nos
ls -l
links. Não tenho uma flecha no shell para mostrar a direção do meu link. Portanto, tenho que mudar isso".Você o cria em uma direção, para poder usá-lo na outra.
(FIM DA PARTE RESPOSTA-PERGUNTA)
Em outro nível, a própria palavra "link" carrega um profundo duplo significado oculto. Os links simbólicos vieram mais tarde; portanto, nos primeiros dias, um link era apenas um link. Não havia macio e duro, nenhuma
-s
opção. E agora eu até uso o simbolismo fonte-alvo:Nesta fase, existem links, mas não são rígidos e flexíveis, e
ls -l
não mostram setas, porque não há direção em um link (rígido). Um "link" naquele estágio da evolução do unix significava que o nome do arquivo "B" (entrada de diretório "B") no sistema de arquivos aponta para o mesmo inode que o nome do arquivo "A" está apontando.Os arquivos A e B são "vinculados" juntos, porque compartilham os mesmos blocos. Portanto, agora com todas as rm, o kernel precisa verificar: eu excluo / libero os blocos desse arquivo no disco ou existe outro arquivo vinculado aos mesmos blocos? Para isso, é usado um contador de links.
Digamos que você queira manter um arquivo grande em / tmp grom sendo excluído e restaurado
ln /tmp/bigfile
. Agora você tem um grande arquivo grande no seu diretório de trabalho. Após limpar / tmp e remover o "original", você continua usando os mesmos blocos de dados. Você não recebe um link morto ou danificado, você tem um arquivo normal. Apontar para nenhum arquivo, mas apenas o sistema de arquivos bloqueia como qualquer entrada de diretório. Somente agora "limpeza" / tmp não é tão eficiente quanto antes. Parece vazio, mas os blocos da partição não são liberados.Mesmo que um link físico não custe o espaço em si, como o cp, indiretamente, pode.
Adicionando
ln -s
à sequência acima:Agora "B", o link virtual, possui apenas uma sequência com um nome de caminho. Esta é uma informação "suave". Tecnicamente, "A" e "B" não estão relacionados. Mas ainda assim 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 final) e não "vinculado ao inode do arquivo A"
Ambos os tipos de links podem confundir não apenas humanos, mas também o kernel / fs. A página de manual de 1971 observa: "ERROS: os 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 - precisam ser reconhecidos pelos utilitários / kernel.
Exemplo prático em bash
Começando com um arquivo regular "F" ...
... torna Fhard do mesmo tamanho que F, mas ambos aparecem agora em um vermelho escuro SEM flechas
ls -l --color
. Devido àstat
exibição de "Links: 2" em conexão com "Inode: xyz". A vinculação física F transforma o próprio F em um link físico. Ambos são / permanecem tipo de arquivo "arquivo regular". Mas ambos têm um inode com uma contagem de links acima de 1.... cria um pequeno arquivo "irregular" "Fsoft" com o tipo de arquivo "link simbólico" --- ainda mais economia de espaço que um diretório vazio. A
ls -l
não mostra nada de especial para "F". Para o Fsoft, o tamanho mostrado é de 1 byte, pois a string é 'F' eFsoft -> F
é exibida como nome. Não é necessário colorir um link virtual para reconhecê-lo. Porque, na forma abreviada,ls -F
você@
anexa uma cadeia em espiral :Fsoft@
Com
ls -l
isso fica assim:Fhard tem tamanho e tipo de F.
O Fsoft tem o nome de F e o tamanho do nome de F como tamanho e um tipo de arquivo diferente.
Curto
ls -sF
:adicionar
--block-size=1
também não produz os mesmos tamanhos. O Fsoft tem tamanho "um byte, zero bloco". F e Fhard se desviam em paralelo:Para ver se o Fsoft está pendurado ou não,
ls
use cores.fonte
É realmente útil lembrar que o nome do link é opcional. Se não for fornecido, o nome da base do destino do link é usado.
é idêntico a eliminar completamente o nome do link:
Isso não faria sentido se o destino do link foi mencionado pela última vez.
fonte
Basta pensar em Unix -> AT&T -> destino à direita:
fonte
ln abc def
,abc
edef
são o mesmo objecto; eles são indistinguíveis. Além disso, a operação não tem efeitoabc
, além de aumentar sua contagem de links. O destino édef
. Um ponteiro para o objeto é instalado recentemente nodef
local.ln -s abc def
significa que o conteúdoabc
foi gravado no localdef
.abc
nem precisa resolver nada; pode ser um link pendente.mv dest src
,ln [ -s ] dest src
,cp dest src
, ...Pessoalmente, prefiro evitar me lembrar de X, em vez de saber onde procurar por X quando preciso. Eu também sou fã da atitude "é melhor prevenir do que remediar", então eu 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 o sugeriria se fosse necessário investigar a página de manual, mas como está no começo, IMHO vale os 3 segundos necessários para digitar
man ln
e sair.fonte
Semelhante ao cp, que eu li mentalmente como "copie isso para isso", li comandos ln como "vincule isso para aquilo".
fonte
É assim que me lembro: esqueça o alvo. Em outras palavras, se eu estiver no diretório1 e quiser criar um link simbólico aqui para o arquivo1 existente em / some / other / dir /, eu faria:
Você receberá um link simbólico chamado arquivo1 no diretório1 que aponta para / some / other / dir / arquivo1. Na página de manual do ln:
Lembre-se de que isso funcionará apenas se você desejar que o link simbólico tenha o mesmo nome que o destino (o que provavelmente é o caso).
fonte
Eu gostaria de expandir a resposta de @ gary.
Além da resposta: o
ln
comando pode aceitar um número arbitrário de argumentos, para que você possa criar vários links simbólicos em uma chamada (o que é útil quando você precisar).ln -s foo bar baz
, qual é a explicação mais lógica que argumentos significa o quê?ln -s foo bar
, qual é a explicação mais lógica que argumentos significa o quê?fonte
Imagine uma versão
ln
que permita criar vários links (simbólicos) em um comando.Não seria necessário reverter isso, pois um link simbólico só pode apontar para um de
TARGET
cada vez e a convenção normal da linha de comando é colocar a parte repetida no final da linha de comando, por exemplogrep PAT [FILE]...
fonte
"
ls
mostra quea -> b
simln a b
"Lembre-se de que isso está errado.
fonte
ls -l
:link -> target
pode confundir sua ideia de como configurar aln
linha de comando. Mas receio que isso não ajude muito.