使用sudo时别名不可用

今天我正在玩别名,我注意到在使用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 

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

~/.bashrc下行添加到~/.bashrc

 alias sudo='sudo ' 

从bash手册 :

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

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

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

我为它写了一个影响sudo的Bash函数。

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

这是我作为单行的function:

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

或格式很好:

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

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

别名是特定于用户的 – 您需要在/root/.bashrc定义它们

@Alvins答案是最短的答案。 毫无疑问! 🙂

但是我想到了一个在sudo执行别名命令的命令行解决方案,其中不需要使用alias命令重新定义sudo

以下是我对可能感兴趣的人的建议:

 type -a  | grep -o -P "(?<=\`).*(?=')" | xargs sudo 

ll命令的情况下

 type -a ll | grep -o -P "(?<=\`).*(?=')" | xargs sudo 

说明

当你有别名(例如: ll )时,命令type -a返回别名表达式:

 $type -a ll ll is aliased to `ls -l' 

grep你选择重音`和撇号'之间的文字,在这种情况下ls -l

并且xargs执行选定的文本ls -l作为sudo参数。

是的,有点长但完全干净 ;-)无需重新定义sudo作为别名。

我有另一个很好的解决方案,它也增加了一些信任:

使用bash完成function可以在按Tab键时自动将sudo后面的单词替换为别名。

将其保存为/etc/bash_completion.d/sudo-alias.bashcomp ,它应该在交互式shell启动时自动加载:

 _comp_sudo_alias() { from="$2"; COMPREPLY=() if [[ $COMP_CWORD == 1 ]]; then COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$/\1/" )" ) return 0 fi return 1 } complete -o bashdefault -o default -F _comp_sudo_alias sudo 

然后登录到新的终端,你应该好好去。

我有一个不同的解决方案,您不需要添加sudo作为别名。 我运行Linux Mint 17.3但它应该与Ubuntu非常相似。

当您是root用户时, .profile将从其主目录运行。 如果您不知道root下的主目录是什么,那么您可以查看:

 sudo su echo $HOME 

如您所见, root的主root/root/ 。 检查其内容:

 cd $HOME ls -al 

应该有.profile文件。 打开文件并添加以下行:

 if [ "$BASH" ]; then if [ -f ~/.bash_aliases];then . ~/.bash_aliases fi fi 

基本上,这个bash脚本的作用是检查一个名为.bash_aliases的文件。 如果文件存在,则执行该文件。

保存.profile文件并在.bash_aliases创建别名。 如果已准备好别名文件,则将文件复制到此位置

重新启动终端,你很高兴!

最高投票的答案很棒。 但是,如果键入sudo -i并提升为sudo提示符( # ),则不会使用您想要使用的别名。

要在#提示符下使用别名(以及其他所有内容),请使用:

 sudo cp "$PWD"/.bashrc /root/.bashrc 

“$ PWD”自动扩展为“/ home / YOUR_USER_NAME”的位置

@WinEunuuchs2Unix: $PWD扩展到“当前工作目录”。 我想你想要$HOME

此外,对于大多数情况,最好有一个单独的根.bashrc文件。 实际上,我会在用户的主目录(例如.bashrc_root.bashrc_root它设置为/root ,软链接到它的真实文件,并从用户的.bashrc文件中获取它。 如果稍后此特权用户帐户不再存在,则根.bashrc文件仍可供其他用户使用。