AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 541795
Accepted
Zhro
Zhro
Asked: 2019-09-15 16:57:25 +0800 CST2019-09-15 16:57:25 +0800 CST 2019-09-15 16:57:25 +0800 CST

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

  • 772

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

symlink ln
  • 14 14 respostas
  • 7526 Views

14 respostas

  • Voted
  1. Hermann
    2019-09-15T17:37:50+08:002019-09-15T17:37:50+08:00

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

    • 104
  2. Best Answer
    gary
    2019-09-15T17:17:41+08:002019-09-15T17:17:41+08:00

    Eu uso o seguinte: lntem um formulário de um argumento (2º formulário listado na página de manual ) no 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 alvo é sempre o primeiro argumento.

    • 45
  3. Kusalananda
    2019-09-16T01:40:28+08:002019-09-16T01:40:28+08:00

    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 manual GNU lné o estranho e chama o source destino e o nome do target link .

    • Manual GNU paraln

        ln [option]… [-T] target linkname
      

    Ignorando a escolha de palavras do GNU, o lnutilitário segue a mesma 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. Ou seja, bé o alvo da operação que cria um link simbólico usando acomo 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:

    $ 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
    

    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" da lnoperaçã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 lnpareça mais natural.

    • 11
  4. loa_in_
    2019-09-16T11:52:40+08:002019-09-16T11:52:40+08:00

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

    Algo velho, algo novo,

    algo emprestado, algo azul,

    e seis pence em seu sapato.

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

    • 9
  5. David Z
    2019-09-16T01:16:41+08:002019-09-16T01:16:41+08:00

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

    • 7
  6. user370539
    2019-09-15T18:24:21+08:002019-09-15T18:24:21+08:00
    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; 
    

    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 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 ln -s /usr/lib/modulesde obter um

    modules -> /usr/lib/modules
    

    com 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 -lpara 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 -sopção. E agora 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 hard e soft, e ls -lnã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:

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

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

    ln F Fhard
    

    ...faz com que Fhard tenha o mesmo tamanho de F, mas ambos aparecem agora em vermelho escuro SEM setas em ls -l --color. Por statmostrar "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.

       ln -s F Fsoft
    

    ...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 -lnão mostra nada de especial para "F". Para Fsoft, o tamanho mostrado é de 1 byte, pois a string é 'F' e Fsoft -> Fé exibida como nome. Não há necessidade de colorir um soft link para reconhecê-lo, porque na forma abreviada ls -Fvocê obtém uma corrente enrolada @anexada:Fsoft@

    Com ls -lele 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.

    Fsoft tem o nome de F e o comprimento do nome de F como tamanho e um tipo de arquivo diferente.

    Curto ls -sF:

    5932 F    5932 Fhard     0 Fsoft@
    

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

    6074368 F  6074368 Fhard    0 Fsoft@
    

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

    ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file
    
    • 4
  7. rexkogitans
    2019-09-16T10:07:18+08:002019-09-16T10:07:18+08:00

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

    ln -s /path/to/file1 file1
    

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

    ln -s /path/to/file1
    

    Isso não faria sentido se o destino do link fosse mencionado por último.

    • 2
  8. Kaz
    2019-09-18T17:07:16+08:002019-09-18T17:07:16+08:00

    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
    
    • 1
  9. jl6
    2019-09-16T06:11:39+08:002019-09-16T06:11:39+08:00

    Semelhante ao cp, que eu li mentalmente como “copiar isso para aquilo”, eu li os comandos ln como “vincule isso a aquilo”.

    • 0
  10. dr_
    2019-09-24T00:54:32+08:002019-09-24T00:54:32+08:00

    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:

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

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

    • 0

relate perguntas

  • Expansão de caminho de alias

  • Como fazer com que o tar siga todos os links simbólicos, exceto um link simbólico recursivo

  • Caminhos em ln com hard links e soft links

  • Link simbólico criado acidentalmente para uma pasta nessa pasta

  • É possível um arquivo shadow no diretório com links simbólicos?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve