我今天在玩别名,我注意到别名在使用时似乎不可用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 ll
,sudo
bash 只检查第一个单词 ( ) 的别名,会ll
被忽略。我们可以sudo
通过在别名值的末尾添加一个空格来告诉 bash 检查别名之后的下一个单词(即)。
别名是用户特定的 - 您需要在 /root/.bashrc
我为它编写了一个 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
文件中,但不要忘记获取它的来源或之后重新启动终端会话以应用更改。
归档时间: |
|
查看次数: |
82199 次 |
最近记录: |