sudo 使终端崩溃,但可以在 .sh 文件中运行

sudo 使终端崩溃,但可以在 .sh 文件中运行

更新 2021 年 12 月 24 日

我不得不从接受的答案中找到并 grep 代码来尝试找到罪魁祸首,以便由于其他原因重新启动,但一旦找到根本问题,我将更新这篇文章CtrlC

然而,我使用了接受的答案的重新定义 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 *()' {} +

一旦您找到它,我建议您提交错误报告。 (假设它适合您,欢迎您建议我提供的代码作为修复。)

相关内容