为什么 sudo 忽略别名?

amp*_*ent 28 shell sudo alias

我正在运行 Ubuntu 10.04 并upstart用于守护进程管理。我的企业应用程序作为守护程序运行,并且由于各种特权必须以 root 身份运行。例如:

sudo start my-application-long-ID
sudo stop my-application-long-ID
etc
Run Code Online (Sandbox Code Playgroud)

我想介绍一个alias将这些命令缩写为:

alias startapp='sudo start my-application-long-ID'
Run Code Online (Sandbox Code Playgroud)

并按原样运行它startapp,但我希望别名中没有 sudo 。

alias startapp='start my-application-long-ID'
Run Code Online (Sandbox Code Playgroud)

运行时不会使用sudo startapp,返回sudo: startapp: command not found

但是,当我添加别名时:

alias sudo='sudo '

sudo startapp 现在有效,但我仍然很好奇为什么 sudo 忽略别名。

Ram*_*esh 50

我从这里看到以下信息。

使用 sudo 时,请使用别名扩展(否则 sudo 会忽略您的别名)

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

为什么它不工作解释的原因在这里

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


Gil*_*il' 7

别名和函数在 shell 中定义。Sudo 是一个外部程序。所以 sudo 看不到别名、函数或 shell 内置命令,只能看到外部命令。

别名旨在作为备用命令名称,因此 shell 仅在命令位置扩展它们,而不是当它们是命令的参数时。Zsh 支持全局别名,可以在命令行的任何地方扩展,最好谨慎使用,因为即使在别名没有意义的上下文中也有意外扩展它们的风险。

你可以告诉sudo来调用一个shell: sudo sh -c '…shell command here…'。但是,您通常的别名在该 shell 命令中将不可用,因为它们通常存储在诸如~/.bashrc或 之类的文件中,该文件~/.zshrc只能由交互式 shell 读取。

alias sudo='sudo ',正如Ramesh提议的,导致外壳在sudo.

  • @CMCDragonkai 是的 (2认同)