如何正确设置别名 sudo='nocorrect sudo '?

如何正确设置别名 sudo='nocorrect sudo '?

直到最近,我才alias sudo='sudo '在我的.zshrc文件中发现了这个问题。今天,我在尝试执行以下操作时遇到了此错误sudo mv

➜  ~  sudo mv nginx.conf.orig nginx.conf.orig2
sudo: nocorrect: command not found

现在通过谷歌搜索我发现这似乎与一些以 为前缀的命令有关nocorrect,我可以用它来解决这个问题alias sudo='nocorrect sudo'

但是,当我尝试将别名设置为alias sudo='nocorrect sudo '允许自己使用其他别名时,问题就出现了。我还确保我的 su 使用的是 zsh,如上所述这里

➜  ~  alias sudo='nocorrect sudo '            
➜  ~  sudo mv nginx.conf.orig nginx.conf.orig2
sudo: nocorrect: command not found
➜  ~  alias sudo='nocorrect sudo'                           
➜  ~  sudo mv nginx.conf.orig nginx.conf.orig2
➜  ~  su
Password: 
michaelarch# ps -p $$
  PID TTY          TIME CMD
25831 pts/1    00:00:00 zsh

有人对如何解决这个问题有什么建议吗?

编辑:alias sudo='sudo '允许您在 sudo 命令中使用别名,例如见下文。

➜  ~  alias cat='echo hello'     
➜  ~  echo goodbye > example.txt
➜  ~  cat example.txt           
hello example.txt
➜  ~  sudo cat example.txt 
goodbye
➜  ~  alias sudo='sudo '
➜  ~  sudo cat example.txt
hello example.txt

有关我的 shell 的更多信息:

➜  ~  sudo chsh                               
Changing shell for root.
New shell [/usr/bin/zsh]:    
➜  ~  unalias sudo; alias sudo='nocorrect sudo '
➜  ~  echo $SHELL; which sudo                   
/usr/bin/zsh
sudo: aliased to nocorrect sudo 
➜  ~  sudo mv nginx.conf.orig2 nginx.conf.orig  
sudo: nocorrect: command not found
➜  ~  which mv
mv: aliased to nocorrect mv

答案1

该行为可以通过以下方式重现:

alias sudo='nocorrect sudo '
alias mv='nocorrect mv '

因此,当执行时,sudo mv foo bar它会扩展为

nocorrect sudo nocorrect mv foo bar

并抛出一个错误不正确是 shell 保留字,不能由 sudo 处理。

mv 别名被扩展的原因在于您alias sudo='nocorrect sudo '使用尾随空格来定义,这允许随后进行别名扩展。如果没有尾随空格,此示例可以正常工作,但您完全失去了在 sudo 之后使用别名的能力。

一种解决方法是在 sudo 之后进行别名扩展,但是为了防止在使用 sudo 时sudo mv出现转义命令的错误:mv

sudo \mv foo bar

这可以防止 mv 的别名扩展。

答案2

好的,我已经研究这个问题一段时间了,并在 zsh 邮件列表中找到了一些东西。似乎没有一个“灵丹妙药”解决方案,而是一堆不同的解决方案,它们的作用不同。我将发布我所做的事情(这有点逃避现实),同时也探讨其他方法及其问题。我个人将采用:

➜  ~  alias sudo='sudo '
➜  ~  alias nsudo='nocorrect sudo'

编辑:

我现在要去

sudo \mv foo bar

对于我需要这种情况的情况,正如@mpy 在备用答案中所描述的那样。

/编辑

因为它允许我大多数时间使用别名,并且当它们因为别名为 nocorrect 而抱怨时,我可以使用,nsudo这样我就不会意外地破坏我的文件。

更好的方法来自 zsh 邮件列表。我发现有两个关于此问题的帖子。一个来自 1999 年这里(这是问题所在,请看后续内容,尤其是这个这解决了noglob问题。我不确定它是否也能解决 nocorrect 问题(noglob 是否意味着 nocorrect?否则我认为不是,请评论)

alias sudo='my_sudo '

function my_sudo {
    while [[ $# > 0 ]]; do
        case "$1" in
        command) shift ; break ;;
        nocorrect|noglob) shift ;;
        *) break ;;
        esac
    done
    if [[ $# = 0 ]]; then
        command sudo zsh
    else
        noglob command sudo $@
    fi
}

这满足了我问题中的两个要求:

➜  ~  alias cat='echo hello'     
➜  ~  echo goodbye > example.txt
➜  ~  sudo cat
hello
➜  ~  sudo mv example.txt2 example.txt

这个问题似乎又出现了在2008在邮件列表中有一个解决方案,如下:

alias sudo='noglob do_sudo '
function do_sudo
{
    integer glob=1
    local -a run
    run=( command sudo )
    if [[ $# -gt 1 && $1 = -u ]]; then
        run+=($1 $2)
        shift ; shift
    fi
    (($# == 0)) && 1=/bin/zsh
    while (($#)); do
        case "$1" in
        command|exec|-) shift; break ;;
        nocorrect) shift ;;
        noglob) glob=0; shift ;;
        *) break ;;
        esac
    done
    if ((glob)); then
        PATH="/sbin:/usr/sbin:/usr/local/sbin:$PATH" $run $~==*
    else
        PATH="/sbin:/usr/sbin:/usr/local/sbin:$PATH" $run $==*
    fi
}

这似乎做了很多我承认不完全理解的事情。这似乎忽略了自动更正(正如作者所说)。

相关内容