我运行的是 Ubuntu 10.04,用于upstart
守护进程管理。我的企业应用程序作为守护进程运行,并且由于各种权限而必须以 root 身份运行。例如:
sudo start my-application-long-ID
sudo stop my-application-long-ID
etc
我想引入一个alias
将这些命令缩写为:
alias startapp='sudo start my-application-long-ID'
并运行它,startapp
这样就可以了,但我不想在别名中使用 sudo 。
alias startapp='start my-application-long-ID'
运行时不使用sudo startapp
,返回sudo: startapp: command not found
。
但是,当我添加别名时:
alias sudo='sudo '
sudo startapp
现在可以了,但我仍然好奇为什么 sudo 忽略别名。
答案1
答案2
别名和函数在 shell 中定义。 Sudo 是一个外部程序。因此 sudo 看不到别名、函数或 shell 内置命令,只能看到外部命令。
别名是备用命令名称,因此 shell 仅在命令位置扩展它们,而不是在它们作为命令的参数时扩展它们。 Zsh 支持全局别名,这些别名可以在命令行的任何位置展开,并且最好谨慎使用,因为即使在别名没有意义的上下文中,也存在意外扩展它们的风险。
您可以告诉 sudo 调用 shell: sudo sh -c '…shell command here…'
。但是,您常用的别名在该 shell 命令中不可用,因为它们通常存储在诸如~/.bashrc
或 之类的文件中~/.zshrc
,该文件只能由交互式 shell 读取。
alias sudo='sudo '
, 作为拉梅什提出,导致 shell 在 后扩展别名sudo
。
答案3
针对 zsh 用户的解决方案
在 bash 和 zsh 中,以空格结尾别名将导致 shell 别名扩展下一个单词。这允许像下面这样的别名扩展myalias
alias 'sudo=sudo '
sudo myalias
不幸的是,当您的别名中包含多个单词(例如 )时,这种情况就会崩溃。sudo -u someone
但是您可以滥用 zsh“全局别名”功能来手动扩展命令中任何位置的别名。
alias -g '$= '
这将创建一个名为(您可以使用任何您想要的单词)的全局别名,$
该别名以空格结尾。这会导致 zsh 将下一个单词扩展为常规命令别名。由于别名会扩展为空格,因此不会将其视为参数。这允许以下工作。
% alias myalias=echo
% sudo -u someone myalias foo
sudo: myalias: command not found
% sudo -u someone $ myalias foo
foo
如果您有复杂的命令嵌套,您甚至可以$
在一个命令行上多次使用。我发现它非常有用,它在我的 zshrc 中具有永久位置,但是别名足够简单,可以定义何时需要使用它。
答案4
我刚刚给出了一个替代答案这里无需sudo
使用别名重新定义。
在你的情况下,它将是:
type -a startapp | grep -o -P "(?<=\`).*(?=')" | xargs sudo
所有这些都在一行中,没有额外的 shell,没有别名重新定义。 ;-)