shell `alias sudo=“sudo“`是如何工作的?

xvw2m8pv  于 2023-08-07  发布在  Shell
关注(0)|答案(3)|浏览(111)

查看将当前用户的别名传递给sudo命令的方法,我在ArchWiki上发现了以下内容:

传递别名

如果您使用了很多别名,您可能已经注意到,在使用sudo时,它们不会转移到root帐户。但是,有一个简单的方法可以让它们工作。只需将以下内容添加到~/.bashrc/etc/bash.bashrc
alias sudo='sudo '
我不明白这为什么有用。如果shell不关心两个命令之间有多少空格,这怎么会有任何影响呢?
手动添加空间时,我没有看到任何差异:

$ alias e=echo
$ sudo e foo
sudo: e: command not found
$ sudo  e foo              # Manual space addition
sudo: e: command not found # Fail
$ alias sudo="sudo "       # Now with alias
$ sudo e foo
foo                        # Succeeds, but why?

字符串
可见的别名sudo到sudo + space以某种方式允许传递别名。这适用于zshbashsh,因此它不是特定于shell的行为。

这个别名是如何工作的?

eaf3rand

eaf3rand1#

查看alias的手册页:
VALUE中的尾随空格会导致在展开别名时检查下一个单词是否有别名替换。
来源:http://www.linuxcommand.org/lc3_man_pages/aliash.html

6g8kf2rb

6g8kf2rb2#

尾随空格会使shell在下一个单词上也尝试别名扩展。
参见https://stackoverflow.com/a/37210013/2115619获取源代码。
这可以无限嵌套:

alias e1=echo e2='echo ' b='extreme mega beans to the max'
e1 b
#> b
e2 b
#> extreme mega beans to the max
e2 e2 e2 b
#> echo echo extreme mega beans to the max
e2 e2 e1 b
#> echo echo b
e2 e1 e2 b
#> echo e2 b
e1 e2 e2 b
#> e2 e2 b

字符串
你也可以像这样创建一个无用但透明的别名:

alias echo='echo ' expand=' '
echo expand expand expand expand expand expand expand expand expand meow
#> meow

xtupzzrd

xtupzzrd3#

我们为团队提供的最佳实践:

alias sodu='sudo'
alias sodo='sudo'
alias sdoo='sudo'
alias sudu='sudo'
alias sduo='sudo'

字符串
只要加上一个你认为对自己有必要的别名

相关问题