O link simbólico para alterar o diretório funciona somente a partir do diretório home

5

Ao usar esta resposta, criei um link simbólico no meu arquivo .bashrc para fazer a alteração para um diretório freqüentemente usado mais fácil.

Por exemplo,

ln -s ~/a/b/c/d/development dev

Eu posso alterar o diretório do meu home dir para o development dir inserindo cd dev . Eu também posso inserir ls dev do meu home dir e isso funciona também.

No entanto, esses comandos somente funcionam no meu home dir. Se eu entrar em outro lugar, recebo um erro dizendo No such file or directory .

Se eu inserir cd ~/dev ou ls ~/dev , isso funciona.

Alguém pode explicar por que isso é e como posso corrigi-lo, então não preciso incluir ~/ no caminho quando não estou em meu diretório pessoal.

    
por ksl 19.01.2017 / 10:30

2 respostas

11

Como você está usando o Bash como seu shell, é possível usar o shell CDPATH variável. O Manual de Bash descreve-o como

a search path: each directory name in CDPATH is searched for directory, with alternative directory names in CDPATH separated by a colon (‘:’)

Você pode adicionar a seguinte linha ao seu .bashrc :

CDPATH=".:$HOME"

Se você digitar mais tarde cd dev , o diretório de trabalho atual será procurado por um subdiretório chamado dev :

  • Se esse diretório existir, ele será alterado para esse diretório (como o comando cd builtin geralmente funciona).
  • Se não, ele procuraria seu diretório pessoal ( ~ ), localizaria o link simbólico (percebesse que é um link para um diretório) e mudaria para o diretório de destino (apontado por ~/dev ).

Se você quisesse dar preferência aos diretórios dentro de seu diretório home, você poderia listar $HOME primeiro em seu CDPATH ( "$HOME:." ) mas eu aconselharia strongmente contra isso, já que isso quebra o princípio de menor surpresa : o comportamento resultante difere muito do padrão.

    
por 19.01.2017 / 10:50
9

Você não pode. Como você pode? O comando ln cria um arquivo que é um link para outro arquivo (ou diretório, ou qualquer outro). Você pode então usar o link como se fosse o original. Mas isso ainda é apenas um arquivo. Ele tem um caminho específico, não é apenas magicamente flutuante e acessível de qualquer lugar no sistema de arquivos. Assim como com qualquer outro arquivo, você não pode simplesmente chamá-lo pelo nome, você precisa usar o seu caminho.

Assim como se você cria um arquivo normal:

$ cd ~/foo
$ touch file
$ cd ~/
$ ls file
ls: cannot access 'file': No such file or directory
$ ls ~/foo/file
file

Um link não é diferente. Você não pode apenas cd cd dev de um diretório aleatório e esperar que ele funcione, assim como você não pode fazer cat file em um diretório aleatório e esperar que o sistema magicamente saiba qual arquivo você deseja.

Você pode obter o comportamento que está procurando usando um script ou uma função, mas não um link. Por exemplo, adicione essas linhas ao arquivo de inicialização do seu shell ( ~/.bashrc for bash):

dev(){
    cd "$HOME"/dev
}

Ou apenas:

alias dev='cd ~/dev'

Agora, executando dev , você será direcionado para ~/dev . Como alternativa, defina uma variável em seu ~/bashrc ou ~/.profile :

dev="$HOME/dev"

Agora você pode executar cd $dev e ser levado para ~/dev . Isso é possível de várias maneiras, mas os links não são relevantes.

    
por 19.01.2017 / 11:02