`alias sudo="sudo "`是怎么工作的?

25

在寻找将当前用户的别名传递给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+空格,可以以某种方式传递别名。这在zsh、bash和sh上都有效,因此它不是特定于shell的行为。

这个别名是如何工作的?


5
这不是需要理解的事情,只需不要这样做。允许sudo调用别名就像站在一张摇摇欲坠的三脚凳上,脖子上套着绞索一样危险。 - William Pursell
3个回答

33

1
尾随的空格会使shell尝试对下一个单词进行别名扩展。
有关来源,请参见https://dev59.com/mVoU5IYBdhLWcg3wsYXM#37210013
这可以无限嵌套:
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

1
我们团队在最佳实践方面得到了什么:
alias sodu='sudo'
alias sodo='sudo'
alias sdoo='sudo'
alias sudu='sudo'
alias sduo='sudo'

只需添加你认为必要的别名


1
我点赞这个,因为它既有趣又真实。 - Michael Schönbauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接