Come si imposta alias sudo = 'nocorrect sudo' correttamente?

Fino a poco tempo fa ho avuto alias sudo='sudo ' nel mio file .zshrc . Oggi mi sono imbattuto in questo errore nel tentativo di fare sudo mv :

 ➜ ~ sudo mv nginx.conf.orig nginx.conf.orig2 sudo: nocorrect: command not found 

Ora ho scoperto che sembrava che avessi a che fare con alcuni comandi prefissati con nocorrect e che potrei risolvere questo problema con alias sudo='nocorrect sudo' .

Tuttavia il problema viene quando cerco di impostare il mio alias su alias sudo='nocorrect sudo ' per consentirmi di utilizzare alias aggiuntivi. Inoltre ho assicurato che il mio su usava zsh come qui accennato.

 ➜ ~ alias sudo='nocorrect sudo ' ➜ ~ sudo mv nginx.conf.orig nginx.conf.orig2 sudo: nocorrect: command not found ➜ ~ alias sudo='nocorrect sudo' ➜ ~ sudo mv nginx.conf.orig nginx.conf.orig2 ➜ ~ su Password: michaelarch# ps -p $$ PID TTY TIME CMD 25831 pts/1 00:00:00 zsh 

Qualcuno ha suggerimenti su come risolvere questo problema?

EDIT: alias sudo='sudo ' ti permette di usare alias con i comandi sudo, per esempio vedi sotto.

 ➜ ~ alias cat='echo hello' ➜ ~ echo goodbye > example.txt ➜ ~ cat example.txt hello example.txt ➜ ~ sudo cat example.txt goodbye ➜ ~ alias sudo='sudo ' ➜ ~ sudo cat example.txt hello example.txt 

Per ulteriori informazioni sulla mia shell:

 ➜ ~ sudo chsh Changing shell for root. New shell [/usr/bin/zsh]: ➜ ~ unalias sudo; alias sudo='nocorrect sudo ' ➜ ~ echo $SHELL; which sudo /usr/bin/zsh sudo: aliased to nocorrect sudo ➜ ~ sudo mv nginx.conf.orig2 nginx.conf.orig sudo: nocorrect: command not found ➜ ~ which mv mv: aliased to nocorrect mv 

Il comportmento è riproducibile con:

 alias sudo='nocorrect sudo ' alias mv='nocorrect mv ' 

Così, quando si esegue sudo mv foo bar questo viene ampliato

 nocorrect sudo nocorrect mv foo bar 

e genera un errore come nocorrect è una parola di shell riservata e non può essere gestita da sudo.

Il motivo per cui l'alias mv viene ampliato è che definisci alias sudo='nocorrect sudo ' con un vuoto in trailing, che consente l'espansione di alias in seguito. Senza questo vuoto in sospeso questo esempio funziona, ma si perde la possibilità di utilizzare alias dopo il sudo completamente.

Una soluzione per avere espansione alias generalmente dopo sudo, ma per impedire l'errore con sudo mv uscire dal command mv quando lo si utilizza con sudo:

 sudo \mv foo bar 

Ciò impedisce l'espansione alias di mv.

Ok, ho scavato in questo per un po 'e ho trovato qualche cosa sulla mailing list zsh. Non sembra essere una sola soluzione "pallottola d'argento" ma un mucchio di soluzioni diverse che fanno cose diverse. Posso pubblicare quello che ho fatto (che è un po 'di un poliziotto), ma anche esplorare gli altri approcci e i loro problemi. Sto personalmente andando con:

 ➜ ~ alias sudo='sudo ' ➜ ~ alias nsudo='nocorrect sudo' 

EDIT:

Ora vado a fare

 sudo \mv foo bar 

per i casi in cui ho bisogno di questo come descritto da @mpy nella risposta alternativa.

/ EDIT

perché mi permetterà di utilizzare gli alias per la maggior parte del tempo e quando si lamentano perché sono aliasati per eseguire correzioni, posso utilizzare nsudo modo che non accidentalmente blocchi i miei file.

Migliori approcci sono dalle liste di mailing zsh. Sembra che ci siano due thread che ho trovato su questo. Uno dal 1999 qui (questa è la domanda, vedi i follow-up, in particolare questo che risolve il problema noglob . Non sono sicuro se risolve anche il nocorrect (il noglob implica nocorrect? Otherwise I do not think it does, please comment)

 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 [email protected] fi } 

Che soddisfa entrambe le mie esigenze dalla mia domanda:

 ➜ ~ alias cat='echo hello' ➜ ~ echo goodbye > example.txt ➜ ~ sudo cat hello ➜ ~ sudo mv example.txt2 example.txt 

Sembra anche che questo sia ripreso nel 2008 sulla mailing list con una soluzione così:

 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 } 

Quella sembra fare molto che non riconosco completamente. Questo sembra ignorare l'autocorrezione (come affermato dall'autore).