如何使用 sudo 为命令创建别名

如何使用 sudo 为命令创建别名

我想添加两个别名,一个在非 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别名(但您不希望fornvimsudo vsudo -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 等(其中一些在其他答案中进行了描述),但语法与您所要求的稍有不同。

相关内容