zsh-users
 help / color / mirror / code / Atom feed
* 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).