使用 sudo 时别名不可用

kem*_*102 197 sudo alias

我今天在玩别名,我注意到别名在使用时似乎不可用sudo

danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found
Run Code Online (Sandbox Code Playgroud)

有什么理由不能在使用时使用别名sudo吗?

Isa*_*iah 319

将以下行添加到您的~/.bashrc

alias sudo='sudo '
Run Code Online (Sandbox Code Playgroud)

bash 手册

当一个词用作简单命令的第一个词时,别名允许用一个字符串替换一个词。shell 维护一个别名列表,可以使用 alias 和 unalias 内置命令设置和取消设置这些别名。

每个简单命令的第一个单词(如果未加引号)将被检查以查看它是否具有 alias。如果是,则该词将替换为别名的文本。字符 '/'、'$'、'`'、'=' 以及上面列出的任何 shell 元字符或引用字符不能出现在别名中。替换文本可以包含任何有效的 shell 输入,包括 shell 元字符。替换文本的第一个单词会测试别名,但与被扩展的别名相同的单词不会被第二次扩展。这意味着可以将 ls 别名为“ls -F”,例如,Bash 不会尝试递归扩展替换文本。如果别名值的最后一个字符是空格或制表符,那么还会检查别名后面的下一个命令字的别名扩展

(强调我的)。
Bash 只检查命令的第一个单词是否有别名,后面的任何单词都不会检查。这意味着在像 一样的命令中sudo llsudobash 只检查第一个单词 ( ) 的别名,会ll被忽略。我们可以sudo通过在别名值的末尾添加一个空格来告诉 bash 检查别名之后的下一个单词(即)。

  • 相当不错的解决方案。 (27认同)
  • 如果我使用 sudo 标志,例如`sudo -H ll`,这会中断吗? (7认同)
  • 强调的引用在 askubuntu.com 当前的样式中表现得不太好。出于好奇,这里是关键行:“*如果别名值的最后一个字符是空格或制表符,则还会检查别名后面的下一个命令字是否有别名扩展。*” (2认同)
  • 阅读文档显然有很多好处:-) (2认同)
  • @mehaase 是的,我试过了,它坏了。 (2认同)

Rag*_*123 5

别名是用户特定的 - 您需要在 /root/.bashrc

  • 这个答案仅适用于当您以 root 身份运行 shell 本身时的情况,如使用“sudo -s”或“sudo -i”(并且*仅*如果单独运行以获得 root shell,*不* 使用 `sudo -s command...` 或 `sudo -i command...` 形式)或 `sudo bash` 或 `sudo su`,或者您已启用 root 登录并拥有 root shell 的情况那样。当非 root 用户从自己的 shell 运行“sudo 命令...”时,别名扩展是由他们自己的非 root shell 完成的。`sudo` 本身并不扩展别名,因此*应用于问题中描述的情况*,这个答案是不正确的。 (5认同)
  • 它们已经在 /root/.bashrc 下,所以这不是问题 (4认同)

Byt*_*der 5

我为它编写了一个 Bash 函数,它会隐藏sudo.

它检查我是否有给定命令的别名,并sudo在这种情况下运行别名命令而不是文字命令。

这是我作为单线的功能:

sudo() { if alias "$1" &> /dev/null ; then $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}" ; else command sudo $@ ; fi }
Run Code Online (Sandbox Code Playgroud)

或者格式很好:

sudo() { 
    if alias "$1" &> /dev/null ; then 
        $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}"
    else 
        command sudo "$@"
    fi 
}
Run Code Online (Sandbox Code Playgroud)

您可以将其附加到您的.bashrc文件中,但不要忘记获取它的来源或之后重新启动终端会话以应用更改。