O alias não "substitui" as entradas PATH?

9

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 tinha pensado que aliases substituem o PATH..?

javadba
fonte
11
Para o registro: tecnicamente, os aliases não substituem nenhum valor no PATHenvar.
Can-ned_food 30/08/19
Cuidado obrigatório: em geral, não é uma boa prática renomear comandos comuns. Isso pode te morder de duas maneiras. 1) Se você trabalha em outro sistema e usa seu comando por hábito, obterá o comportamento inesperado do comando nativo. 2) Se alguém mais usar o seu sistema, mesmo para aconselhar / ajudá-lo a resolver um problema, ele obterá o comportamento inesperado da sua personalização. Comandos personalizados são bons, apenas não os nomeie como os existentes.
Joe
@ Joe Na verdade, é mais do reverso aqui: o OS / X, versão do cp carece de opções de nix para que ele não se comportar como esperado (exceto para aqueles que * como o mancando versão para Mac)
javadba

Respostas:

21

O whichcomando retorna apenas executáveis: não sabe nada sobre aliases, pois é 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, já que typeé um bashcomando interno.

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

Se você criar cpuma função, sua versão será executada em scripts, embora não de outros programas:

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

Se você deseja que você cptrabalhe em qualquer lugar, adicione $HOME/binno início da sua PATHlista e $HOME/bin/cpaponte para ela:

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 (omitir -s), mas isso normalmente precisará de permissões de root ( sudo ln ...). A criação de uma função e a adição à PATHvariável serão feitas em um dos bashscripts de inicialização, com permissões de usuário.

AFH
fonte
11
Embora no CentOS (e no AIUI all RedHat) o perfil padrão (a menos que seja substituído) crie um alias para whichque seja executado /usr/bin/whichcom a entrada canalizada a partir da saída de aliase uma opção que diga para ler essa entrada e use-a para mostrar um alias se corresponder ao comando. Veja unix.stackexchange.com/questions/10525/…
dave_thompson_085
@ dave_thompson_085 - Comentário interessante: eu não usei essas distribuições. Eu uso o Ubuntu e posso obter o mesmo efeito simplesmente usando o alias whichpara type. Em seguida, which -aopera como o programa externo, com a adição do alias e das definições de função. Geralmente não alias which=type, porque gosto de usar $(which ProgName)quando quero forçar o uso de um programa externo, ignorando qualquer alias ou definição de função.
AFH
11
Os links físicos não podem cruzar sistemas de arquivos, portanto, a lnsugestão não simbólica funcionará apenas se o diretório inicial estiver no mesmo sistema de arquivos /usr/local/bin. Ele também se comportará de maneira estranha se você atualizar gcp, pois seu link físico provavelmente ainda se refere à versão antiga.
Inútil
@Useless - Pontos válidos, que é parte do motivo pelo qual eu editei minha resposta para sugerir um link simbólico primeiro, embora eu ache que as permissões sejam provavelmente a consideração mais importante. Quanto à atualização gcp, dependerá se a atualização é feita abrindo e gravando ou excluindo e recriando. Observe que não é relevante se um caminho de origem absoluto ou relativo é usado para criar um link físico, enquanto um link simbólico geralmente precisa de um caminho absoluto. Os links são usados ​​extensivamente no sistema operacional e são principalmente simbólicos.
AFH
11
@ can-ned_food - Não é tão simples quanto configurá-lo no shell atual: ele deve ser definido em cada script, junto com a importação dos aliases.
AFH
13

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

whichnão é um built-in do Bash (é um componente de alguns outros shells, por exemplo, zsh). Como whichnão tem informações privilegiadas nos aliases de Bash, whichapenas analisa PATHo termo fornecido.

type, por outro lado, é um Bash embutido, para que possa relatar aliases.

8bittree
fonte
2
Além disso, os aliases são expandidos apenas se a primeira palavra em um comando. Talvez isso não seja relevante.
Can-ned_food 30/08/19