我想添加两个别名,一个在非 sudo 时执行命令,另一个在 sudo 时执行命令,如下所示:
alias v = 'nvim'
alias 'sudo v' = 'sudo -E nvim '
我也定了alias sudo='sudo '
。
答案1
我正在描述在 中做什么bash
。我不太清楚zsh
去描述那里该做什么。
我认为你的问题出在等号的左侧。使用唯一、简短且易于记住的别名名称(无空格)。另外,等号周围不应有空格。
否则很容易包含sudo
到别名中,只需将其放入别名的定义中即可。我可以用我的别名来展示一个例子~/.bashrc
,
alias uc='sudo umount /dev/sdc*'
(卸载驱动器上的所有分区/dev/sdc
)
我可能建议sv
作为别名的名称,但有一个具有该名称的标准工具,所以也许是sev
' 的缩写s你做 -乙nv我,会工作得更好。
答案2
如果你有
alias sudo='sudo '
alias v='nvim'
然后运行sudo v whatever
就会运行sudo nvim whatever
,因为别名中的尾随空格使得 shell 也会查看下一个单词以进行别名扩展。
但是名称中不能有带有空格的单一别名:Bash 不接受它,而 zsh 接受,但我认为没有办法实际使用它们:
zsh% alias 'a b'='echo test'
zsh% 'a b'
zsh: command not found: a b
$ alias 'a b'='echo test'
bash: alias: `a b': invalid alias name
至于将该-E
选项添加到sudo
,如果您不想将其包含在sudo
别名中(即alias sudo='sudo -E '
),那么我能想到的最接近的选项如下所示:
alias sudoe='sudo -E '
alias v='nvim'
# or
alias sudov='sudo -E nvim'
或者正如评论所建议的那样,使用sudoedit
/sudo -e
来编辑文件。
答案3
如果您想使用该特定语法,其中是but执行的v
别名(但您不希望fornvim
sudo v
sudo -E nvim
-E
全部sudo 的使用),您很可能需要使用函数重新定义 sudo。
实际上,定义一个进行不同处理的函数并不那么棘手v
。什么是棘手的是你目前拥有alias sudo='sudo '
.我认为这是因为您希望能够使用另一个别名来执行 sudo-ed 命令。困难的是定义 sudo 函数,这样你就不会失去这种行为。
我建议如下。通过该sudo
函数,我们读取第一个参数。如果是的话v
我们就这么做sudo -E nvim
。如果它是另一个别名,我们将扩展为该别名的值。如果它根本不是别名,我们只需使用常规 sudo 命令:
# for regular use, keep this alias
alias v='nvim'
# replace sudo with this functiom
sudo() {
# check if next argument is 'v'
if [[ "$1" == "v" ]] ; then
# remove 'v' from the argument list
shift
# call sudo -E nvim on remaining arguments
command sudo -E nvim "$@"
# exit the function with the return value of the
# sudo nvim -E command
return $?
fi
# now check if first argument is a different alias; if so,
# $expansion will be the alias definition if one exists,
# or else it will be the empty string
local expansion="${BASH_ALIASES[$1]}"
if [[ -n "$expansion" ]] ; then
# remove the alias from the argument list
shift
#if the expansion has variables in it,
#we need to expand those variables, not
#just the $expansion variable itself,
#so we use eval
eval "command sudo $expansion \"\$@\""
# exit the function with its return value
return $?
fi
# if we got here, what follows sudo is a
# normal command, so we execute sudo with the
# rest of the arguments as is
command sudo "$@"
}
可能有更简单的方法,但我认为这应该可行。
当然还有其他更简单的替代方案,例如使用 sudo 的别名、使用 sudoedit 等(其中一些在其他答案中进行了描述),但语法与您所要求的稍有不同。