Posso criar um “alias de diretório” personalizado como '~' no bash?

13

No bash, posso ir para o meu diretório pessoal com cd ~e realmente me referir ao meu diretório pessoal com qualquer comando com ~.

Posso criar novos "aliases de diretório" personalizados (?) Para me referir a outros diretórios? Exemplo hipotético:

make_alias "~~" /mnt/photon/work/foo_project/

cp ~/home.png ~~/set_8/home_4.png

Como isso pode ser feito? Se não pode, é por design e por que?

É bom ter: onde e como ~é definido e vinculado a esse "~"?

n611x007
fonte
1
Não é particularmente útil para você, mas você pode fazer isso com aliases globais em .... ZSH, mas não em BASH. : alias -g ~~ = '/ mnt / photon / work / foo_project /'
SuperMagic
1
@SuperMagic: Eu também gosto de apelidos globais. Mas no segundo exemplo (cp ~~ / set ...) eles irão falhar. Diretórios nomeados são mais apropriados: n=/mnt/photon/work/foo_projecte então cp foo ~n/bar. (Nota para o OP: também limitado ao zsh).
mpy
1
@ Oliveriver Salzburg: Eu não acho que isso seja uma duplicata. A outra pergunta é sobre remapeamentos de caracteres únicos ( @ou _), o que não é possível no bash, enquanto ~~certamente é (hacky, mas possível). Além disso, ele não responde como esse remapeamento é feito.
Dennis
A questão relacionada foi: superuser.com/questions/541767 #
n611x007

Respostas:

25

O til não é um alias, faz parte da expansão do shell do bash (exatamente como *.txtou $((1 + 2))).

A expansão do Bash til suporta os seguintes prefixos de til:

~            The value of $HOME

~/foo        $HOME/foo

~fred/foo    The subdirectory foo of the home directory of the user fred

~+/foo       $PWD/foo

~-/foo       ${OLDPWD-'~-'}/foo

~N           The string that would be displayed by `dirs +N'

~+N          The string that would be displayed by `dirs +N'

~-N          The string that would be displayed by `dirs -N'

dirsusa a pilha de diretórios. Você pode usar pushdpara adicionar um diretório a ele.

Para responder sua pergunta específica sobre ~~, sim, é possível mapear um diretório para ele. Basta criar um usuário chamado ~e definir /mnt/photon/work/foo_project/como seu diretório inicial:

sudo useradd '~'
sudo sed -i 's#:/home/~:[^:]*$#:/mnt/photon/work/foo_project:/bin/false#' /etc/passwd

Obviamente, uma abordagem muito "mais saudável" é apenas definir uma variável do shell que aponta para o seu diretório no seu ~/.bashrccom o comando

foo=/mnt/photon/work/foo_project

que pode ser acessado via $foo, como de costume.

Dennis
fonte