Como fazer um “alias” para um longo caminho?

91

Tentei fazer um "alias" para um caminho que uso com frequência durante a execução de scripts de shell. Tentei algo, mas falhou:

myFold="~/Files/Scripts/Main"
cd myFold

bash: cd: myFold: No such file or directory

Como faço isso funcionar?
No entanto, cd ~/Files/Scripts/Mainfunciona.

bashboy
fonte

Respostas:

113

Como é uma variável de ambiente (o alias tem uma definição diferente em bash), você precisa avaliá-la com algo como:

cd "${myFold}"

ou:

cp "${myFold}/someFile" /somewhere/else

Mas eu realmente acho mais fácil, se você quiser apenas a facilidade de mudar para esse diretório, para criar um verdadeiro alias (em um dos basharquivos de inicialização, como .bashrc), para que eu possa salvar pressionamentos de tecla:

alias myfold='cd ~/Files/Scripts/Main'

Então você pode apenas usar (sem o cd ):

myfold

Para se livrar da definição, você usa unalias. A transcrição a seguir mostra tudo isso em ação:

pax> cd ; pwd ; ls -ald footy
/home/pax
drwxr-xr-x 2 pax pax 4096 Jul 28 11:00 footy

pax> footydir=/home/pax/footy ; cd "$footydir" ; pwd
/home/pax/footy

pax> cd ; pwd
/home/pax

pax> alias footy='cd /home/pax/footy' ; footy ; pwd
/home/pax/footy

pax> unalias footy ; footy
bash: footy: command not found
paxdiablo
fonte
Obrigado. Isso funciona. Tentei apenas o alias myfold = '~ / some / path' e cd myfold. Recebo um erro - nenhum diretório. Por quê ? Além disso, é possível "cancelar a atribuição" de uma variável de alias?
bashboy
myfold = '~ / some / path' cd "$ myfold" Falha. Por quê ?
bashboy
1
@bashboy, provavelmente porque você não tem um diretório com esse nome. ~ / algum / caminho é um exemplo, você deve substituir o caminho real que deseja usar. Vou alterá-lo para usar seu diretório de exemplo para que fique mais claro. Sobre como cancelar a atribuição de um alias, você usa o comando unalias. Também atualizei a resposta com uma transcrição, incluindo o uso desse comando.
paxdiablo
Como você preservaria esse alias em diferentes sessões de terminal? Quando abro uma nova aba e tento usar este alias, não funciona.
goldisfine de
4
@goldisfine, veja meu parênteses in one of the bash startup files like .bashrc. Colocar o alias em um arquivo de inicialização adequado garantirá que ele esteja disponível para todas as sessões.
paxdiablo
68

Existe uma opção de shell cdable_vars:

cdable_vars
Se for definido, um argumento para o cdcomando embutido que não é um diretório é considerado o nome de uma variável cujo valor é o diretório para o qual mudar.

Você pode adicionar isso ao seu .bashrc:

shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main

Observe que substituí o til por $HOME; as aspas evitam a expansão do til e o Bash reclama que não há diretório ~/Files/Scripts/Main.

Agora você pode usar isso da seguinte maneira:

cd myFold

Não é $necessário. Esse é o ponto principal, na verdade - como mostrado em outras respostas, cd "$myFold"funciona sem a opção shell. cd myFoldtambém funciona se o caminho emmyFold contiver espaços, não é necessário fazer aspas.

Isso geralmente funciona até mesmo com o preenchimento automático da guia, pois a _cdfunção em bash_completionverificações se cdable_varsestá definida - mas nem toda implementação o faz da mesma maneira, então você pode ter que fazer o código bash_completionnovamente no seu .bashrc(ou editar /etc/profilepara definir a opção shell).


Outros shells têm opções semelhantes, por exemplo Zsh ( cdablevars).

Benjamin W.
fonte
Existe um equivalente disso para ZSH?
Ryan Stull
@RyanStull setopt cdablevarsparece que pode ser, mas eu não sei nada sobre zsh.
Benjamin W.
@JohnMee Vou reverter sua edição, pois a) a opção é chamada de forma diferente em zsh (sem sublinhado) b) a pergunta marcada apenas com Bash ec) Estou vinculado ao manual do Bash. Vou adicionar um parágrafo para mencionar os outros shells, no entanto.
Benjamin W.
@JohnMee E não consigo encontrar a opção de csh ou tcsh, como se chama?
Benjamin W.
Que resposta ótima! Muito obrigado porcdable_vars
Lucas P.
10

Talvez seja melhor usar links

Soft Link

Simbólico ou soft link (arquivos ou diretórios, mais flexíveis e autodocumentados)

#      Source                            Link
ln -s /home/jake/doc/test/2000/something /home/jake/xxx

Hard Link

Hard link (somente arquivos, menos flexível e não autodocumentável)

#    Source                            Link
ln /home/jake/doc/test/2000/something /home/jake/xxx

Como criar um link para um diretório

Dica : se você não precisa ver o link em sua casa, você pode começar com um ponto. ; então ficará oculto por padrão, então você pode acessá-lo como

cd ~/.myHiddelLongDirLink
Mahmoud Bahnasy
fonte
9

Você pode adicionar qualquer caminho que desejar à tabela de hash de seu bash:

hash -d <CustomName>=<RealPath>

Agora você poderá cd ~<CustomName>. Para torná-lo permanente, adicione-o ao seu bashrc script .

Observe que esta tabela de hash tem como objetivo fornecer um cache para que o bash não precise pesquisar por conteúdo toda vez que um comando for executado, portanto, essa tabela será limpa em eventos que invalidam o cache, por exemplo, modificação $PATH.

Rodrigo Martins de Oliveira
fonte
2
Acho que só funcionará em, zshmas não em bash.
sergej
Esta é a melhor resposta IMHO, mas é verdade que funciona zshapenas, pelo menos no meu sistema Ubuntu.
John Stewart
6

Primeiro, você precisa remover as aspas:

bashboy@host:~$ myFolder=~/Files/Scripts/Main

As aspas evitam que o shell expanda o til para seu significado especial de ser seu $HOMEdiretório.

Você poderia então usar $myFolderum ambiente como uma variável de shell:

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$

Para fazer um alias , você precisa definir o alias:

alias myfolder="cd $myFolder"

Você pode então tratar isso como um comando:

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$
David W.
fonte
Na verdade, não é uma variável de ambiente a menos que você export.
Keith Thompson
1
@KeithThompson Ok, é apenas uma variável de shell . Porém, você não deseja exportá-lo porque não deseja que possivelmente afete os processos filhos. Você o define dessa forma em seu .bashrcarquivo de recurso ou em qualquer outro que usar, e ele será definido no shell imediato, mas não em scripts de shell.
David W.
Prefiro essa solução porque funciona com completação automática
Vassilis
5

Primeiro, você precisa $acessar o valor de "myFold" para fazer o código na questão funcionar:

cd "$myFold"

Para simplificar, você cria um alias em ~/.bashrc:

alias cdmain='cd ~/Files/Scripts/Main'

Não se esqueça de fornecer .bashrcuma vez para tornar o alias disponível na sessão bash atual:

source ~/.bashrc

Agora você pode mudar para a pasta usando:

cdmain
hek2mgl
fonte
4

Outra opção seria usar um link simbólico. ie:

ln -s ~/Files/Scripts/Main ~/myFold

Depois disso, você pode realizar operações ~/myFoldcomo:

cp some_file.txt ~/myFold

que colocará o arquivo ~/Files/Scripts/Main. Você pode remover o link simbólico a qualquer momento com rm ~/myFold, o que manterá o diretório original.

dvj
fonte
Uma desvantagem: se você fizer cd myFoldisso pwd, isso mostrará que você está em myFold. Isso é um problema para mim porque os comandos relativos com controle de origem p4 dependem do diretório atual.
Usuário5910
1
@ User5910 - usepwd -P
dvj
2

mas um alias real para um dir também é possível, tente

 myScripts="~/Files/Scripts/Main"
 alias myScripts="cd $myScripts"

Dessa forma, você tem uma convenção de nomenclatura comum (para cada par dir / alias) e, se precisar copiar algo do diretório atual para myScripts, não precisa se preocupar com isso.

IHTH

shellter
fonte
1

As respostas anteriores que tentei não permitem a expansão automática (preenchimento automático) de subdiretórios do diretório com alias.

No entanto, se você colocar o diretório do qual deseja criar um atalho na dirspilha ...

$ pushd ~/my/aliased/dir

... você pode digitar dirs -vpara ver sua posição numérica na pilha:

 0  ~/my/aliased/dir
 1  ~/Downloads
 2  /media/usbdrive

e consulte-o usando esse número para a maioria, senão todos os comandos que esperam um parâmetro de diretório:

 $ mv foo.txt ~0  

Você pode até usar Tabpara mostrar os subdiretórios imediatos do diretório "alias":

 $ cd ~0/<Tab>
 child_dir1    child_dir2
chb
fonte
-1

Coloque a seguinte linha no seu myscript

set myFold = '~/Files/Scripts/Main'

No uso do terminal

source myscript
cd $myFold
Chayan Pathak
fonte