更新 2021 年 12 月 24 日
我不得不从接受的答案中找到并 grep 代码来尝试找到罪魁祸首,以便由于其他原因重新启动,但一旦找到根本问题,我将更新这篇文章Ctrl。C
然而,我使用了接受的答案的重新定义 sudo 代码来解决问题,我可以 sudo 离开而不会崩溃!
因此,对于在我找到源问题之前可能遇到问题的任何其他人,我所做的就是:
.bashrc
我的 .bashrc 文件的底部
# https://unix.stackexchange.com/a/683619/344030
if [ -f ~/.sudo-fix ]; then
source ~/.sudo-fix
else
echo '
答案1
所以,我们已经已确定为什么sudo
不能正常工作。看起来它试图做的是重新定义一个sudo
不带参数的独奏,意味着重复您输入的最后一个命令,但作为sudo
前缀。
聪明的想法但糟糕的实施 - 未引用的内容$@
必须用双引号引起来才能正常工作,并且为了避免递归,该sudo
命令必须在函数内部而不是函数本身使用:
# Redefine sudo to reuse the last command if no args
sudo() {
if [ $# -gt 0 ]
then command sudo "$@"
else command sudo "${BASH:-bash}" -c "$(history -p '!!')"
fi
}
现在,找到它的定义位置将变得更加困难。这个命令将是一个很好的起点(类似于我假设的递归命令grep
,但允许函数名称和 之间的空格()
是可选的,以及排除不相关的目录):
command sudo find / \( -path '/dev' -o -path '/proc' -o -path '/run' -o -path 'sys' \) -prune -o -type f -exec grep -l 'sudo *()' {} +
一旦您找到它,我建议您提交错误报告。 (假设它适合您,欢迎您建议我提供的代码作为修复。)