Ok, eu tenho cavado isso por um tempo e encontrei algumas coisas na lista de discussão zsh. Não parece haver uma solução "bala de prata", mas um monte de soluções diferentes que fazem coisas diferentes. Vou postar o que fiz (o que é um pouco fora), mas também explorar as outras abordagens e seus problemas. Eu pessoalmente vou com:
➜ ~ alias sudo='sudo '
➜ ~ alias nsudo='nocorrect sudo'
EDITAR:
Agora irei com
sudo \mv foo bar
para os casos em que preciso disso, conforme descrito por @mpy na resposta alternativa.
/ EDIT
porque me permitirá usar aliases na maior parte do tempo e quando eles reclamarem porque estão com alias para nocorrect, eu posso usar nsudo
para que eu não acidentalmente estrague meus arquivos.
Melhores abordagens são das listas de discussão zsh. Parece haver dois tópicos que eu encontrei sobre isso. Um de 1999 aqui (essa é a questão, veja os acompanhamentos, especialmente esta que resolve o problema noglob
Eu não tenho certeza se ele resolve nocorrect também (o noglob implica nocorrect? caso contrário, acho que não, por favor, comente)
alias sudo='my_sudo '
function my_sudo {
while [[ $# > 0 ]]; do
case "$1" in
command) shift ; break ;;
nocorrect|noglob) shift ;;
*) break ;;
esac
done
if [[ $# = 0 ]]; then
command sudo zsh
else
noglob command sudo $@
fi
}
O que satisfaz os meus requisitos da minha pergunta:
➜ ~ alias cat='echo hello'
➜ ~ echo goodbye > example.txt
➜ ~ sudo cat
hello
➜ ~ sudo mv example.txt2 example.txt
Parece também que isso surgiu novamente em 2008 na lista de discussão com uma solução assim:
alias sudo='noglob do_sudo '
function do_sudo
{
integer glob=1
local -a run
run=( command sudo )
if [[ $# -gt 1 && $1 = -u ]]; then
run+=($1 $2)
shift ; shift
fi
(($# == 0)) && 1=/bin/zsh
while (($#)); do
case "$1" in
command|exec|-) shift; break ;;
nocorrect) shift ;;
noglob) glob=0; shift ;;
*) break ;;
esac
done
if ((glob)); then
PATH="/sbin:/usr/sbin:/usr/local/sbin:$PATH" $run $~==*
else
PATH="/sbin:/usr/sbin:/usr/local/sbin:$PATH" $run $==*
fi
}
O que parece estar fazendo muita coisa que eu não entendo totalmente. Isso parece ignorar a autocorreção (conforme declarado pelo autor).