直到最近,我才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
}
这似乎做了很多我承认不完全理解的事情。这似乎忽略了自动更正(正如作者所说)。