我正在运行 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)。
别名和函数在 shell 中定义。Sudo 是一个外部程序。所以 sudo 看不到别名、函数或 shell 内置命令,只能看到外部命令。
别名旨在作为备用命令名称,因此 shell 仅在命令位置扩展它们,而不是当它们是命令的参数时。Zsh 支持全局别名,可以在命令行的任何地方扩展,最好谨慎使用,因为即使在别名没有意义的上下文中也有意外扩展它们的风险。
你可以告诉sudo来调用一个shell: sudo sh -c '…shell command here…'。但是,您通常的别名在该 shell 命令中将不可用,因为它们通常存储在诸如~/.bashrc或 之类的文件中,该文件~/.zshrc只能由交互式 shell 读取。
alias sudo='sudo ',正如Ramesh所提议的,导致外壳在sudo.