Como configurar o bash para sempre resolver o caminho completo para links simbólicos [duplicados]

1

Moderadores: ESTE NÃO É UM DUPLICADO !!!! Por favor, remova a marca duplicada.

As respostas ligadas a não respondem, na verdade, à minha pergunta, como a resposta aceita. O Google só aponta para as outras respostas, que na verdade não respondem a essa pergunta em particular.

Ao seguir um link simbólico para um diretório, o tipo bash tenta fazer a ilusão de que o link simbólico é um diretório real. No entanto, existem muitos casos em que isso é quebrado. Por exemplo, considere que eu possa ter:

/usr/local/src/project-a-1.0/
/usr/local/src/project-b-2.2/

então, eu tenho um link simbólico no meu diretório pessoal:

ln -s /usr/local/src/project-a-1.0 ~/project

Agora, eu quero fazer um atalho para trabalhar com project-a :

cd ~/project

Até agora, tudo bem - mas bash fingir que estou realmente em ~/project , não no diretório de trabalho real. Ele até finge quando usa o pwd embutido, mas é claro que não quando se usa o executável /bin/pwd .

Agora, se eu quiser fazer o check-out de um arquivo em project-b , talvez queira tentar que vim ../project-b<TAB> tente fazer o trabalho de conclusão de comando. No entanto, bash se recusa a concluir isso, porque acha que .. é o diretório que contém as casas dos usuários.

No entanto, se eu digitar vim ../project-b-2.2/somefile.txt , isso funciona bem, o que eu esperava.

Links simbólicos não são diretórios, e todos os tipos de inconvenientes e até mesmo erros acontecem devido a esse problema no bash. Eu tentei procurar uma opção para desativar isso, mas todos os hits do google e do superusuário são apenas "como eu manualmente resolvo um caminho de link" - não é isso que eu quero aqui; Eu quero que o bash pare de tentar emular um sistema de arquivos no meu sistema de arquivos, mal. Certamente, existe alguma opção que vai colocar a correção na frente da ilusão?

O pop-up "perguntas semelhantes" apontou para duas outras perguntas que o Google já me enviou; ambos exigem que eu passe a opção "-P" para pwd ou cd ou até mesmo recomende usar readlink para descobrir o destino do link simbólico. Isso não é nada do que eu estou interessado. Eu quero que o pwd e o prompt do shell $PWD internos correspondam à saída física da chamada do sistema getcwd() ; essas perguntas não falam sobre isso.

    
por Jon Watte 23.04.2018 / 03:48

2 respostas

3

Existe uma opção de todo o shell para isso:

-P

If set, do not resolve symbolic links when performing commands such as cd which change the current directory. The physical directory is used instead. By default, Bash follows the logical chain of directories when performing commands which change the current directory.

For example, if /usr/sys is a symbolic link to /usr/local/sys then:

$ cd /usr/sys; echo $PWD
/usr/sys
$ cd ..; pwd
/usr

If set -P is on, then:

$ cd /usr/sys; echo $PWD
/usr/local/sys
$ cd ..; pwd
/usr/local

Então, isso deve te dar o comportamento que você quer:

set -P
    
por 23.04.2018 / 07:58
0

Isso pode não ser o que você quer ouvir, mas eu diria que a ideia de um caminho canônico para um arquivo é falha.

Primeiro, se você criar um link físico para um arquivo existente, agora existem literalmente dois caminhos distintos para o mesmo arquivo:

$ cd "$(mktemp --directory)"
$ touch foo
$ ln foo bar
$ ls --inode 
1223418 bar  1223418 foo

Não há "original" entre esses dois e eles mantêm os mesmos metadados, exceto pelo nome:

$ touch --date='2001-02-03 04:05:06.789' bar
$ ls -lA
total 0
[…] Feb  3  2001 bar
[…] Feb  3  2001 foo

Em segundo lugar, há muitas maneiras de se referir a um arquivo, dependendo do contexto:

  • Caminhos relativos a um link físico ou simbólico
  • Caminhos absolutos (vários, como visto acima) para um link rígido ou simbólico
  • file: /// absolute / path / to / file ou outros protocolos

Todos são úteis em diferentes contextos.

Em terceiro lugar, Bash não está "fingindo" nada ; não há ilusão, você realmente está nesse diretório. O fato de ser um link simbólico deve ser transparente para quase todas as ações que você faria com ele.

Quarto, os links simbólicos não têm nada a ver com o Bash ; eles são um recurso do sistema de arquivos, não relacionados a nenhum shell, terminal ou mesmo sistema operacional. E todos os principais sistemas de arquivos os têm, então, tentar ignorá-los provavelmente vai atrapalhar em vez de ajudá-lo.

Finalmente, qualquer ferramenta que trate links simbólicos especialmente sem ser explicitamente instruída a fazê-lo deve ser corrigida, porque tem um bug .

    
por 23.04.2018 / 06:22