Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: making sudo work with functions/builtins



Wayne Davison writes:
 > Sweth Chandramouli writes:
 > > i just had a little brainstorm about how to get around this:
 > > 
 > > % alias sudo='sudo cmd '
 > > % cat cmd
 > > #!/bin/sh
 > > eval $SHELL -c \"$@\"
 > 
 > While this cures the error of sudo trying to run "nocorrect", it
 > does not propagate the "nocorrect" forward soon enough to turn off
 > spelling corrections on the command.  This delayed application is
 > more of a problem with a command that has the "noglob" modifier:
 > 
 > % alias e='noglob echo'
 > % e f*
 > f*
 > % sudo e f*
 > foo
 > 
 > I know of no way around this problem.

Aw, sure you do.  You almost got it ... all you have to do is reverse
the order of handling noglob.

do_sudo() { 
    integer glob=1
    while (($#))
    do
        case $1 in
        command|exec|-) shift; break;;
	nocorrect) shift; continue;;
	noglob) glob=0; shift; continue;;
	*) break;;
	esac
    done
    (($# == 0)) && 1=zsh
    if ((glob))
    then
        command sudo $~==*
    else
	command sudo $==*
    fi
}
alias sudo='noglob do_sudo '

However, I don't know of any equivalent way to handle nocorrect.

 > It doesn't allow me to run any shell builtins or functions, though.

I don't have 3.1.5 on this laptop, so I forget the new "whence" option
for this, but I think you could test whether something was a builtin
or function, and if so cause the do_sudo or my_sudo helper function to
invoke zsh -c in such a way as to run it.

I'm not sure what builtins it would be useful to run that way, but ...



Messages sorted by: Reverse Date, Date, Thread, Author