* making sudo work with functions/builtins
@ 1999-02-16 0:15 Sweth Chandramouli
1999-02-16 22:41 ` Wayne Davison
0 siblings, 1 reply; 3+ messages in thread
From: Sweth Chandramouli @ 1999-02-16 0:15 UTC (permalink / raw)
To: ZSH Users
a while ago, someone asked about how to deal with the following
sort of situation:
% alias mv='nocorrect mv'
% alias sudo='sudo '
% sudo mv foo bar
sudo: nocorrect: command not found
from what i can tell, this happens because sudo requires that its
first argument be an actual command, and not a builtin or a function;
adding the space after sudo in the alias makes expansion take place on cp,
so that what sudo sees as the first arg is 'nocorrect'. i just had a
little brainstorm about how to get around this:
% alias mv='nocorrect mv'
% ls
cmd foo
% alias sudo='sudo cmd '
% cat cmd
#!/bin/sh
eval $SHELL -c \"$@\"
% sudo mv foo bar
% ls
bar cmd
%
my question is twofold--is there a more efficient way to do
this, and can anyone see a situation where this would break something
that would otherwise work?
-- sweth.
--
Sweth Chandramouli
IS Coordinator, The George Washington University
<sweth@gwu.edu> / (202) 994 - 8521 (V) / (202) 994 - 0458 (F)
<a href="http://astaroth.nit.gwu.edu/~sweth/disc.html">*</a>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: making sudo work with functions/builtins
1999-02-16 0:15 making sudo work with functions/builtins Sweth Chandramouli
@ 1999-02-16 22:41 ` Wayne Davison
1999-02-17 5:30 ` Bart Schaefer
0 siblings, 1 reply; 3+ messages in thread
From: Wayne Davison @ 1999-02-16 22:41 UTC (permalink / raw)
To: Sweth Chandramouli; +Cc: ZSH Users
Sweth Chandramouli writes:
> i just had a little brainstorm about how to get around this:
>
> % alias mv='nocorrect mv'
> % ls
> cmd foo
> % alias sudo='sudo cmd '
> % cat cmd
> #!/bin/sh
> eval $SHELL -c \"$@\"
> % sudo mv foo bar
> % ls
> bar cmd
> %
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.
Note that your solution also some quoting problems:
% sudo echo 'f*'
foo
% sudo echo 'one two' 'three four'
one two three four
% touch 'one two'
% sudo cat 'one two'
cat: cannot open one
cat: cannot open two
One way to fix these is by changing your "cmd" shell script to be:
#!/local/bin/zsh
noglob $@
The way I worked around the sudo problem was to use the following
alias and function. In addition to avoiding the errors, it also
allows me to type just "sudo" to get the effect of "sudo zsh":
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
}
It doesn't allow me to run any shell builtins or functions, though.
..wayne..
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: making sudo work with functions/builtins
1999-02-16 22:41 ` Wayne Davison
@ 1999-02-17 5:30 ` Bart Schaefer
0 siblings, 0 replies; 3+ messages in thread
From: Bart Schaefer @ 1999-02-17 5:30 UTC (permalink / raw)
To: Wayne Davison; +Cc: Sweth Chandramouli, ZSH Users
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 ...
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~1999-02-17 17:32 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-02-16 0:15 making sudo work with functions/builtins Sweth Chandramouli
1999-02-16 22:41 ` Wayne Davison
1999-02-17 5:30 ` Bart Schaefer
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).