Os aliases globais existem no bash

4

Gostaria de saber se é possível definir um alias "global" no bash, como a opção de alias do zsh -g - não "global" do ponto de vista do usuário mas do ponto de vista da concha.

O que eu quero saber é: Um alias (ou algo mais?) pode ser substituído em qualquer lugar em uma linha no bash?

por exemplo:

alias ...='../..'
    
por maxxvw 16.07.2015 / 11:58

3 respostas

4

Na página bash(1) man:

ALIASES 
  Aliases allow a string to be substituted for a word when it is used  as
  the  first  word  of  a  simple command. [...]

Portanto, bash aliases não têm esse recurso, nem bash tem uma capacidade pre-exec trivial (mas veja aqui para um hack embora).

Como alternativa parcial , você pode usar a função conclusão , aqui está um ponto inicial mínimo:

function _comp_cd() {
    local cur=${COMP_WORDS[COMP_CWORD]} # the current token
    [[ $cur =~ \.\.\. ]] && {
        cur=${cur/.../..\/..}
        COMPREPLY=( $cur )
        return
    }
    COMPREPLY=()    # let default kick in
}

complete -o bashdefault -o default -F _comp_cd cd

Agora, quando você clicar na guia em um comando cd e a palavra sob o cursor contiver "...", cada uma será substituída por "../ ..". A conclusão também sofre de um pequeno problema (excluindo sua complexidade) que você provavelmente pode adivinhar a partir do acima, você precisa especificá-lo em um comando por base de comando.

O pacote de conclusão do bash usa um manipulador de conclusão padrão, com carregamento direto das funções de conclusão para lidar com isso. Se você estiver se sentindo aventureiro, deverá poder modificar sua função% _filedir() da função interna, que é usada para expansão geral de arquivos / diretórios, de modo a incluir uma substituição semelhante "...".

(Tudo isso lembra do shell NetWare, que fez "..." Just Work.)

    
por 16.07.2015 / 13:32
4

Os apelidos bash funcionam somente com base na primeira palavra da linha e não podem ser definidos em um sentido global como zsh.

O único fudge em que consigo pensar seria definir uma variável, por exemplo,

export PP=../..  # $PP meaning parent of parent
cd $PP/anotherDirectory

Mas, para ser honesto, prefiro apenas digitar ../ .. nesse caso. Em suma bash não faz isso.

    
por 16.07.2015 / 12:31
3

Os aliases de bash não têm essa capacidade, mas você pode escrever:

alias cd='cd '
alias ...='../..'
cd ... # teleport to ../..

Explicação:

Manual de referência do Bash diz:

If the last character of the alias value is a blank, then the next command word following the alias is also checked for alias expansion.

A solução possível é a macro de Readline . Você pode escrever:

set -o emacs
bind '"\C-x...":"cd ../.."'

Digite echo , Controle + x , . . .

Você deve ver echo cd ../..

Veja

por 20.07.2015 / 03:22

Tags