Obtém a expansão de um alias (em bash e zsh)

1

Eu quero pegar o texto que um alias se expande.

Por exemplo, se eu tiver:

alias g=hub
alias cdh='cd $HOME'

Eu quero ter:

expand_alias g == hub

expand_alias cdh == cd $HOME

O mais complicado é que os dois shells têm saídas diferentes: bash:

$ alias g cdh
alias g='git'
alias cdh='cd $HOME'

zsh:

% alias g cdh
g=hub
cdh='cd $HOME'

Não observe o prefixo alias nem aspas em torno de hub .

    
por Tom Hale 18.08.2018 / 12:10

4 respostas

1

Com base na resposta de Stéphane Chazelas , eu criei:

# Expand an alias as text - https://unix.stackexchange.com/q/463327/143394
function expand_alias {
  if [[ -n $ZSH_VERSION ]]; then
    # shellcheck disable=2154  # aliases referenced but not assigned
    printf '%s\n' "${aliases[$1]}"
  else  # bash
    printf '%s\n' "${BASH_ALIASES[$1]}"
  fi
}

(com o bash 4.0 ou mais recente).

    
por 22.08.2018 / 10:21
3

Em zsh , você pode usar apenas

get_alias() {
  printf '%s\n' $aliases[$1]
}

Com bash (supondo que não esteja no modo POSIX, caso em que seu alias daria uma saída semelhante a zsh 's), você poderia fazer:

get_alias() (
  eval '
    alias() { printf "%s\n" "${1#*=}"; }'"
    $(alias -- "$1")"
)

Basicamente, avaliamos a saída de alias depois de ter redefinido alias como uma função que imprime o que está à direita do primeiro = em seu primeiro argumento.

Você poderia usar uma abordagem semelhante para algo compatível com a maioria dos shells POSIX, zsh e bash :

get_alias() {
  eval "set -- $(alias -- "$1")"
  eval 'printf "%s\n" "${'"$#"'#*=}"'
}
    
por 18.08.2018 / 20:01
0

Que tal definir uma função de shell:

EXA() { alias $@ | sed 's/^/expand_/; s/=/ == /; s/\o047//g; '; }
    
por 18.08.2018 / 12:20
-1

No meu ambiente zsh, quando digito alias sem comando, obtenho stdout uma lista de todos os aliases. O mesmo acontece no bash (no MacOS ambos). Estes estão em um formato alias=expansion

Assim, você pode filtrar mais com sed: alias | sed -ne 's/cdh=\(.*\)$//p' se "cdh" for o alias que você deseja conhecer. Você poderia fazer uma função de shell no seu perfil para isso, se esta é uma tarefa comum para você: como

expand_alias() { alias $@ | sed -ne 's/.*=\(.*\)$//p' }

    
por 18.08.2018 / 12:20