Equivalente de alias para um link simbólico?

18

Eu me vejo precisando pular alguns diretórios na minha pasta pessoal e me cansar de escrevê-los. Eu gostaria de uma abordagem mais rápida, que tradicionalmente seria um link simbólico.

No entanto, não quero sobrecarregar meu diretório pessoal com dezenas de links simbólicos. Eu poderia criar alguns ~/links/ diretório e clutter ele com links simbólicos, mas ainda é feio. Além disso, talvez eu queira criar links simbólicos que mudam a cada dia (definidos em .bashrc) para ir para o diretório de dias atuais.

Existe uma maneira de efetivamente aliasar um link simbólico, criando algo que será reconhecido como um link para navegação rápida, mas não será exibido quando eu fizer um ls do meu diretório inicial e não durar além da sessão atual?

    
por dsollen 17.12.2015 / 21:27

6 respostas

12

Você pode usar a conclusão de guias. Por padrão, em muitas distribuições do Linux, o bash é configurado para que, quando você apertar a tecla [TAB], você receba uma lista de possíveis correspondências, ou se houver apenas uma correspondência, tudo estará preenchido. Para cd, esta é normalmente uma lista de subdiretórios do diretório de trabalho atual. Você pode sobrescrever isso, mas sugiro que crie um alias, como jd para "diretório de salto":

alias jd=cd

e, em seguida, definindo os "marcadores" desejados como conclusões para o jd. Olhe para a página man bash para muito mais opções (incluindo a geração automática dos resultados em tempo real a partir de um comando ou função), mas a maneira mais fácil é apenas uma lista de palavras, com -W :

complete -W "/ srv / www ~ / tmp ~ / work" jd

Agora, digite jd e pressione [TAB], e você verá seus "favoritos". Digite qualquer parte ambígua e, em seguida, pressione [TAB] para concluir. (Acima, o ~ s expande para meu diretório home, então o primeiro [TAB] me dá um / , e se eu atingir w e [TAB] novamente, /srv/www é preenchido.)

Claro, coloque isso em ~/.bash_profile para persistir.

Ou podemos levar isso para o próximo nível. Crie um diretório ~/.shortcuts - começando com um ponto, ele estará oculto e não bagunce seu diretório inicial limpo e limpo - e preencha com links simbólicos para os diretórios desejados. Em seguida, coloque este no seu ~ / .bash_profile:

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

Isso define uma conclusão um pouco mais complicada no fuction _list_shortcuts para criar a lista de nomes e torna jd uma função em vez de um simples alias, pois queremos que ela aja de maneira diferente de apenas cd . O -P flag para cd faz com que ele resolva os links simbólicos, então tudo se torna uma mágica transparente. Seus nomes de atalhos nem precisam corresponder aos alvos.

Então:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

E, para uma dose extra de fantasia, faça com que jd liste todos os seus atalhos quando executado sem nenhum parâmetro:

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

Nota: eu uso compgen -W $( cmd ) em vez de compgen -C 'cmd' porque o último nunca funciona para mim e eu não entendo o porquê. Essa pode ser uma nova questão minha. :)

    
por 17.12.2015 / 22:50
17

Aliases de shell têm o recurso que você pode fazer (alguns) com a complementação de nomes (geralmente ligada à aba ). Como alternativa, você pode usar o recurso CDPATH , que "recentemente" (nos últimos 5 a 6 anos) foi aprimorado para suportar a conclusão de nome. Se isso funciona para você, tem a vantagem de que o que você digita é o nome real do diretório em vez de um mnemônico para ele.

De acordo com o manual bash

CDPATH
A colon-separated list of directories used as a search path for the cd builtin command.

Leitura adicional:

por 18.12.2015 / 00:21
16

Para os diretórios que você frequenta com frequência, mas não mudam diariamente, outra opção é apenas ter vários comandos alias no seu arquivo .bashrc :

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

Um amigo tem cerca de 50 deles; Eu tenho um punhado; Rápido e fácil. Apenas

cdo

para alterar o diretório para / u01 / app / oracle

    
por 17.12.2015 / 22:34
7

Eu recomendo pushd e popd .

Pessoalmente, acho-os úteis quando realizo trabalho de desenvolvimento / leitura do código fonte, quando vários directórios estão envolvidos.

Eles implementam efetivamente uma estrutura de pilha / LIFO, onde você PUSH um diretório ( pushd ), e o próximo comando do diretório POP ( popd ) a recupera.

Então, quando dentro de um diretório, você faria:

pushd .

E quando você precisar recuperá-lo, faça

popd

Você pode executar vários pushd (s) e fazer o correspondente popd (s) mais tarde para retornar aos diretórios.

Vou deixar aqui um link.

link

    
por 17.12.2015 / 21:32
3

Você poderia apenas colocá-los como variáveis no seu ~/.bashrc e, em seguida, eles estão apenas a $ .

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj
    
por 18.12.2015 / 01:23
3

A resposta óbvia é variáveis , aquelas coisas simbólicas no shell que representam outras coisas, similarmente aos links simbólicos no sistema de arquivos.

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

Em qualquer shell decente, você obtém a conclusão Tab nos nomes das variáveis, o que ajuda ainda mais.

    
por 18.12.2015 / 01:34