Dicas para lembrar a ordem dos parâmetros para ln?

64

Eu costumava lnescrever 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 -> bcomo 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?

Zhro
fonte
11
às vezes ajuda dizer em voz alta quando você digita "link simbólico para ae chama b"
jsotola 15/09
2
Você cria o segundo parâmetro exatamente como com cp e cria o link. Mas se você entendeu errado, não se preocupe, porque você não pode substituir um arquivo ou link simbólico existente por um novo link.
sudodus 15/09
11
Pense nisso como um "apelido de bandido". Ele sempre é chamado primeiro pelo seu nome real, depois pelos apelidos. Ex: Tony Baloney, também conhecido como Oscar Meyer. Ou, no caso do seu link, ln -sab significa "O arquivo-a também é conhecido como Arquivo-b".
Scottie H
11
ln source target. Mesmo que cp source target, mv source target; ...
user207421 17/09

Respostas:

40

Eu uso o seguinte: lnpossui uma forma de argumento único (segunda forma listada na página de manual ) na qual apenas o destino é necessário (porque como poderia lnfuncionar sem conhecer o destino) e lncria 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.

Gary
fonte
3
Observe que o formulário sem caminho de destino / destino é uma extensão da especificação POSIX de ln.
Kusalananda
11
@kusa: você viu o manual de 1971 na minha resposta com a forma de um argumento? Como pode ser uma extensão do posix se existisse em 1971? --- "Se o nome2 for fornecido, o link
@ SP Não sei se entendi o que você quer dizer. Você está dizendo que uma implementação histórica de alguma forma supera o atual padrão POSIX?
Kusalananda
11
Eu também vejo Nomes diferentes, mesmos argumentos, pelo menos. Eu não tinha ideia de que o gnu é o único com esses nomes de argumentos.
2
Havia muitas respostas boas aqui (especialmente a rima de @loa_in_), mas eu vou seguir com essa. Afirmando que a ordem dos parâmetros é consistente (ignorando -t), parece quase uma prova. " lncria 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.
Zhro 15/09
85

Eu digo " lné como cp. A 'fonte' precisa vir em primeiro lugar".

Hermann
fonte
20
... e gosto mv. mv, cpe lntodos tomam um arquivo existente como primeiro argumento e o nome do arquivo ou diretório de destino pretendido como segundo argumento.
Hans-Martin Mosner 15/09
7
É uma pena que memcpy, strcpyetc. , funcionem ao contrário.
Arkadiusz Drabczyk 15/09
6
@ Hans-MartinMosner, exceto que quando você cria um link simbólico, ele não precisa ser um arquivo existente ...
ilkkachu
11
@ilkkachu Você está certo. Nenhuma regra sem exceção :-)
Hans-Martin Mosner 15/09
11
@ArkadiuszDrabczyk Por outro lado, algo como memcpy(dest,src,n);mapas muito bem para dest = src;. Em outras palavras, defina (os primeiros nbytes de) dest igual a (os primeiros nbytes de) src.
um CVn 17/09
10

A maioria dos Unices documenta o lncomando como

ln source target

(Estou omitindo opções etc. aqui)

Exemplos:

  • O padrão POSIX

    ln [-fs] [-L|-P] source_file target_file
    
  • OpenBSD :

    ln [-fhLnPs] source [target]
    
  • NetBSD e FreeBSD

    ln [-L | -P | -s [-F]] [-f | -iw] [-hnv] source_file [target_file]
    
  • Mac OS

    ln [-Ffhinsv] source_file [target_file]
    
  • Solaris

    /usr/bin/ln [-fns] source_file [target]
    
  • AIX

    ln [ -f | -n ] [ -s ] SourceFile [ TargetFile ]
    

O lnmanual GNU chama o source alvo e o target nome do link .

Ignorando a escolha de palavras do GNU, o lnutilitário segue o mesmo tipo de semântica que, por exemplo, mve cpem que o destino é o que é criado a partir da fonte .

Portanto,

ln -s a b

criaria o link simbólico bapontando para a.

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:

$ ln -s "hello world" README.txt
$ ls -l
total 0
lrwxr-xr-x  1 kk  wheel  11 Sep 15 11:39 README.txt -> hello world
Kusalananda
fonte
5
Eu culpo totalmente a documentação do GNU pelo fato de as pessoas entenderem tudo errado. Sua redação é compreensível em retrospectiva, mas objetivamente confusa.
Konrad Rudolph
6
@KonradRudolph, pelo contrário, a redação do GNU parece certa para mim. O utilitário cria um link com algum nome, apontando para algum lugar. "Nome de Link" é meio óbvio, e "alvo" é um perfeitamente boa descrição de algo que é apontado para . Como uma anedota, às vezes ainda tenho que pensar de que maneira ln -s a bfunciona, 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 apenas ln -si a bquando não tiver certeza, ele reclamará se bjá existir.)
ilkkachu 15/09
11
@KonradRudolph, embora tecnicamente, chamá-lo de "destino" no caso de um link físico esteja errado , pois não é o nome existente, mas o inode que é o destino real. Eu me pergunto se o pessoal do GNU pensou que um usuário comum não deveria pensar nisso com tantos detalhes.
ilkkachu 15/09
É interessante ressaltar, como mencionado nos comentários da resposta de @ gary, que o alvo não é opcional no padrão POSIX.
Zhro 15/09
@kusa: com "ln -s AB --- copie apenas o nome do arquivo para B" Adotei sua interpretação em um contexto ligeiramente alterado. Eu posso até concordar com o seu exemplo radical "olá mundo". "Apenas o nome do arquivo 'É uma string. Só quero sinalizar para você que eu editei um pouco e adicionei muito.
7

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 cpe mv.

David Z
fonte
4
Estou curioso para ter uma idéia de por que isso foi rebaixado. Não há muito aqui que possa estar errado - misturei o pedido ou algo assim?
David Z
Pessoalmente, acho que "em que lugar" ainda não é inequívoco sem a explicação: o que poderia ser "qual é o link que aponta para o link?" (correto) ou "o que está vinculando a algo?" (errado). O mesmo com where: "para onde o link está apontando?" (incorreto) ou "onde o link deve ser criado" (correto). Portanto, isso não necessariamente ajuda muito se você está duvidando de si mesmo. Lembrar cp e mv deve ajudar.
125_m_125 16/09
Todos esperamos que um comando UNIX inclua seus argumentos de arquivo após outros tipos de argumento (como grep faz, por exemplo). Cria um arquivo de um determinado tipo com um determinado conteúdo. O fato de o sistema de arquivos fazer algo especial e geralmente colocarmos o caminho para algum arquivo de origem é incidental para o ln. Por exemplo, eu poderia escrever um editor de texto que armazenasse o conteúdo de sua primeira linha em um link simbólico chamado 1 etc. Isso seria idiota, mas enfatiza que ln cria algum tipo de arquivo com algum conteúdo de texto, nada mais ou menos, e faz com que a ordem dos argumentos pareça lógica.
Dannie
@ 125_m_125 A interpretação alternativa que você apresentou não faz muito sentido para mim, mas tudo bem; esse auxiliar de memória não é para todos.
David Z
6

Recentemente, ouvi uma ótima maneira de lembrar essa coisa em particular: uma rima

Algo velho, algo novo,

algo emprestado, algo azul,

e seis centavos no sapato.

O primeiro verso é o que os argumentos de ln são: algo antigo seguido de um nome da nova entrada de diretório.

loa_in_
fonte
3
NAME    ln -- make a link
SYNOPSIS    ln name1[ name2 ]
DESCRIPTION ln creates a link to an existing file name1. 
            If name2 is given, the link has that name; 

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 lntem isso:

ln [opt] FILENAME

In the 2nd form, create a link to FILENAME in the current directory.

onde você não precisa do nome do link. Depois de ln -s /usr/lib/modulesobter um

modules -> /usr/lib/modules

com 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 -llinks. 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 -sopção. E agora eu até uso o simbolismo fonte-alvo:

mv    A B   --- move the whole file to B (dir or new name)
cp    A B   --- copy whole file (mv and cp are "the same" here)    
ln    A B   --- copy whole file MINUS data blocks (=copy only inode and name), and increase "link count" for track keeping

Nesta fase, existem links, mas não são rígidos e flexíveis, e ls -lnã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:

ln -s A B   --- copy only the file's name to "B"   

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" ...

ln F Fhard

... torna Fhard do mesmo tamanho que F, mas ambos aparecem agora em um vermelho escuro SEM flechas ls -l --color. Devido à statexibiçã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.

   ln -s F Fsoft

... 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 -lnão mostra nada de especial para "F". Para o Fsoft, o tamanho mostrado é de 1 byte, pois a string é 'F' e Fsoft -> Fé exibida como nome. Não é necessário colorir um link virtual para reconhecê-lo. Porque, na forma abreviada, ls -Fvocê @ anexa uma cadeia em espiral :Fsoft@

Com ls -lisso fica assim:

-rw-r--r-- 2 root root 6070340 Sep 16 16:28 F
-rw-r--r-- 2 root root 6070340 Sep 16 16:28 Fhard
lrwxrwxrwx 1 root root       1 Sep 16 16:31 Fsoft -> F

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:

5932 F    5932 Fhard     0 Fsoft@

adicionar --block-size=1também não produz os mesmos tamanhos. O Fsoft tem tamanho "um byte, zero bloco". F e Fhard se desviam em paralelo:

6074368 F  6074368 Fhard    0 Fsoft@

Para ver se o Fsoft está pendurado ou não, lsuse cores.

ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file

fonte
2

É realmente útil lembrar que o nome do link é opcional. Se não for fornecido, o nome da base do destino do link é usado.

ln -s /path/to/file1 file1

é idêntico a eliminar completamente o nome do link:

ln -s /path/to/file1

Isso não faria sentido se o destino do link foi mencionado pela última vez.

rexkogitans
fonte
1

Basta pensar em Unix -> AT&T -> destino à direita:

mov %eax, %ebx  ;; AT&T style assembler syntax: %ebx register gets value of %ecx

mv foo bar    ;; foo renamed to bar

cp foo bar    ;; contents of foo go to bar

foo | bar     ;; data moves left to right in pipeline

ln abc def    ;; link to abc installed as def
Kaz
fonte
"cp foo bar" significa "barrar". "ln abc def" significa "abc". Se você tivesse mantido os símbolos: "to foo". Esse é exatamente o problema.
@ user370539 Isso não é verdade; depois ln abc def, abce defsão o mesmo objecto; eles são indistinguíveis. Além disso, a operação não tem efeito abc, além de aumentar sua contagem de links. O destino é def. Um ponteiro para o objeto é instalado recentemente no deflocal.
Kaz
@ user370539 Se o link for simbólico, ln -s abc defsignifica que o conteúdo abcfoi gravado no local def. abcnem precisa resolver nada; pode ser um link pendente.
Kaz
Seu comentário está exatamente ... errado. Deveria ser o contrário.
rexkogitans
@rexkogitans Meu argumento é que é consistente. Se a ordem é "errado" e deve ser revertida, então deve ser para todos os comandos: mv dest src, ln [ -s ] dest src, cp dest src, ...
Kaz
0

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:

   ln [OPTION]... [-T] TARGET LINK_NAME
   (...)
   In the 1st form, create a link to TARGET with the name LINK_NAME.

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 lne sair.

dr01
fonte
-1

Semelhante ao cp, que eu li mentalmente como "copie isso para isso", li comandos ln como "vincule isso para aquilo".

jl6
fonte
2
Isso é muito semelhante à resposta mais bem avaliada .
Michael
Então "ln -s AB 'liga A a B? Agora é A -> B ou B -> A? Acho que a maioria nem passou pelo primeiro estágio de confusão. Dizem que é simples, mas está errado.
-2

É 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:

ln -s /some/other/dir/file1

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:

Em [OPÇÃO] ... TARGET (2º formulário) ... No 2º formulário, crie um link para o TARGET no diretório atual.

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).

Hopping Bunny
fonte
Alguém pode explicar por que isso foi rebaixado? Acabei de copiar e colar da página de manual (e, consequentemente, atribuída). Ajudará outras pessoas a entender como postar no SE. Obrigado.
Hopping Bunny
eu posso explicar: é um choque cultural. Não se preocupe. Verifique as outras respostas, comentários ...
-3

Eu gostaria de expandir a resposta de @ gary.

Além da resposta: o lncomando 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).

  1. Com esse conhecimento, quando você encontra ln -s foo bar baz, qual é a explicação mais lógica que argumentos significa o quê?
  2. Com a resposta ao número 1, quando você encontra ln -s foo bar, qual é a explicação mais lógica que argumentos significa o quê?
yegle
fonte
11
Se você tiver um acréscimo à resposta de gary, sugira-a como uma edição. Como estão, suas duas perguntas finais (hipotéticas?) Fazem com que essa "resposta" pareça mais uma segunda pergunta.
Jeff Schaller
-3

Imagine uma versão lnque permita criar vários links (simbólicos) em um comando.

Synopsis: ln -s TARGET NEW_LINK...
Example: ln -s target_file  new_link_1  new_link_2  new_link_3

Não seria necessário reverter isso, pois um link simbólico só pode apontar para um de TARGETcada vez e a convenção normal da linha de comando é colocar a parte repetida no final da linha de comando, por exemplogrep PAT [FILE]...

jrw32982
fonte
-6

" lsmostra que a -> bsim ln a b"

Lembre-se de que isso está errado.

Ó meu Deus
fonte
6
Eu sempre me lembro de "algo - algo está sempre errado". Mas que caminho está errado? Esse é o problema. O problema passa a ser minha segunda adivinhação, mesmo quando eu acerto. Porque na verdade não consigo me lembrar da ordem correta!
Zhro 15/09
Acho que entendo o que você quer dizer: a saída de ls -l: link -> targetpode confundir sua ideia de como configurar a lnlinha de comando. Mas receio que isso não ajude muito.
sudodus 15/09