Compare commits

...

7 Commits

Author SHA1 Message Date
Frederick Zhang 6448b2e688
Merge 4de06d21e0 into 69a6359f7c 2024-12-02 17:05:08 +00:00
Frederick Zhang 4de06d21e0
preserve exit code 2021-10-01 00:30:32 +10:00
Frederick Zhang aad3bb04a8
fix globbing 2021-10-01 00:30:31 +10:00
Frederick Zhang 23f1c44ae2
avoid conflict with 1-9 alises 2021-10-01 00:30:31 +10:00
Frederick Zhang 557234e352
do not resolve command to absolute path
it breaks commands e.g. sudo -u http echo foobar as http is both a
command (httpie) and a user/group (httpd) in my system
2021-10-01 00:30:30 +10:00
Frederick Zhang 7f4d633f46
do_sudo: recursive alias expansion 2021-10-01 00:30:29 +10:00
Frederick Zhang d05feb1f8e
do_sudo: new sudo alias to handle alias expansion 2021-10-01 00:30:26 +10:00
2 changed files with 61 additions and 0 deletions

View File

@ -0,0 +1,6 @@
# `do_sudo` plugin
This plugin provides a sudo wrapper that handles alias expansion and avoids
being broken by `nocorrect` `noglob` from other aliases.
Modified from the script by [Wayne Davison](https://www.zsh.org/mla/users/2008/msg01229.html).

View File

@ -0,0 +1,55 @@
if [[ "$ENABLE_CORRECTION" == "true" ]]; then
alias sudo='nocorrect noglob _do_sudo '
else
alias sudo='noglob _do_sudo '
fi
function _do_sudo() {
[[ -z ${__do_sudo_glob+x} ]] && __do_sudo_glob=1
[[ -z ${__do_sudo_expanded+x} ]] && declare -A __do_sudo_expanded
local -a args
local -a cmd_alias_arr
local cmd_alias
local return_value
while (($#)); do
case "$1" in
command|exec|-) shift; break ;;
nocorrect) shift ;;
noglob) __do_sudo_glob=0; shift ;;
[1-9]) args+=( $1 ); shift ;;
*)
cmd_alias="$(command -v 2>/dev/null -- "$1")"
if [[ "$?" -eq 0 ]] && [[ "$cmd_alias" == 'alias'* ]] && [[ -z "$__do_sudo_expanded["$1"]" ]]; then
__do_sudo_expanded["$1"]=1
IFS=' ' read -A cmd_alias_arr <<< "$(sed -e "s/[^=]*=//" -e "s/^'//" -e "s/'$//" <<< "$cmd_alias")"
args+=( "${cmd_alias_arr[@]}" )
shift
break
else
if ((__do_sudo_glob)); then
args+=( $~==1 )
else
args+=( $==1 )
fi
shift
fi
;;
esac
done
if [[ ${#cmd_alias_arr[@]} -gt 0 ]]; then
_do_sudo "${args[@]}" $==*
else
if ((__do_sudo_glob)); then
PATH="/sbin:/usr/sbin:/usr/local/sbin:$PATH" command sudo "${args[@]}" $~==*
else
PATH="/sbin:/usr/sbin:/usr/local/sbin:$PATH" command sudo "${args[@]}" $==*
fi
return_value=$?
unset __do_sudo_glob
unset __do_sudo_expanded
return $return_value
fi
}
command -v _sudo >/dev/null 2>&1
[[ $? -eq 0 ]] && compdef _sudo '_do_sudo'