O alias não “sobrescreve” as entradas do PATH?

8

A última linha do meu .bash_profile é:

alias cp=/usr/local/bin/gcp

No entanto, isso está sendo esmagado pela entrada no meu $PATH :

$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to '/usr/local/bin/gcp'

Eu achava que os aliases substituem o PATH ..?

    
por javadba 29.08.2017 / 21:10

2 respostas

20

O comando which retorna apenas executáveis: ele não sabe nada sobre aliases, já que é um programa externo e não há mecanismo para passar informações de alias para um processo filho.

Se você digitar o comando type -a cp , verá todas as interpretações possíveis, em ordem de preferência. Isso inclui qualquer alias, pois type é um comando bash internal.

É importante perceber que um alias não será interpretado por um subprocesso, como um script ou um editor interativo que tenha a opção de executar comandos do sistema.

Se você criar a função cp , sua versão será executada em scripts, mas não em outros programas:

cp() { /usr/local/bin/gcp "$@"; }

Se você quiser que seu cp funcione em todos os lugares, adicione $HOME/bin na cabeça da lista PATH e aponte $HOME/bin/cp para apontar para ele:

ln -s /usr/local/bin/gcp $HOME/bin/cp

Isso cria um link simbólico, embora você possa torná-lo um link físico um pouco mais eficiente (omit -s ), mas isso normalmente precisará de permissões de root ( sudo ln ... ). Criar uma função e adicionar à variável PATH será feito em um dos scripts de inicialização bash , com permissões de usuário.

    
por 29.08.2017 / 21:26
13

Os aliases são internos ao shell. Outros programas não saberão sobre eles.

which não é um Bash embutido (é embutido em alguns outros shells, por exemplo, zsh). Como which não possui informações privilegiadas nos aliases do Bash, which apenas examina PATH para o termo determinado.

type , por outro lado é um Bash embutido, então ele pode reportar aliases.

    
por 29.08.2017 / 21:26