zsh: Uma função de prefixo que executa o resto da linha sem expansão de alias

1

Estou pensando em:

function noalias() { 
  setopt localoptions noexpandalias
  "$@"
 }

Mas não sei qual deve ser a última linha. %código%? %código%? %código%? %código%? %código%? %código%? (você poderia explicar as diferenças entre eles?)

    
por HappyFace 23.11.2018 / 10:15

1 resposta

1

Os aliases são expandidos em um estágio inicial, antes de um comando simples ser entendido como se uma função fosse executada, o que não funciona.

Você precisa da opção noaliases ( expandalias é a opção bash ) para estar em vigor antes que a linha de comando seja lida e analisada.

No entanto, se você quiser desabilitar somente aliases normais, são aqueles expandidos na posição de comando definida com alias foo=bar , fazendo:

noalias() "$@"

é suficiente, porque se houver um alias para cmd , ele não será expandido em:

noalias cmd args

Porque cmd não está na posição de comando.

Isso não funcionaria para aliases globais (aqueles definidos com alias -g , como alias -g args=foo do que expandir qualquer palavra shell se eles estão na posição de comando ou não).

Mesmo se você fez:

noalias() { 
  setopt localoptions noaliases
  eval "$@"
}

E invoque seu comando com:

noalias 'cmd args'

Isso não seria infalível, por exemplo, depois:

alias -g "'cmd arg'=gotcha"

ou

alias -g noalias=gotcha

Você precisa executar

set +o expandalias

Antes do comando ser lido. Você poderia fazer isso com uma ligação de chave:

toggle-aliases() {
  if [[ -o aliases ]]; then
    set +o aliases
  else
    set -o aliases
  fi
  zle -I
}
zle -N toggle-aliases
bindkey '\eA' toggle-aliases
PS1='[aliases $options[aliases]] '$PS1

Pressione Alt + Deslocamento + A para alternar.

    
por 23.11.2018 / 10:38

Tags