针对 zsh 用户的解决方案

针对 zsh 用户的解决方案

我运行的是 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

我看到以下信息来自这里

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

alias sudo='sudo '

解释了它不起作用的原因这里

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

答案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,没有别名重新定义。 ;-)

相关内容