sudo:命令:在 CentOS 6 上找不到命令

Posted

技术标签:

【中文标题】sudo:命令:在 CentOS 6 上找不到命令【英文标题】:sudo: command: command not found on CentOS 6 【发布时间】:2019-04-05 20:50:55 【问题描述】:

MVCE:

关于bash 4.1.2Centos 6.10(因为我们是怪物)。

sudo command vim

返回

sudo: command: command not found

我不明白为什么。在bash 4.4.23Mac OS High Sierra 上,它按预期工作。由于人们使用“命令”作为他们正在谈论的各种命令的占位符,因此很难在 google 上搜索。

实际问题:

我有一个名为 vim 的函数(见下文),将 command 从它对 vim 的调用中取出 不会 导致它失败,就像我所期望的那样,在两者上bash 4.4 和 4.1。

如果我无法写入文件,我有一个自动 sudo vim 的功能:

vim() 
    #only good for auto-sudo. delete if no sudo privileges.
    if [[ "$#" -ne 1 ]]; then
        command vim "$@"
    #cases: if we can write to the file, or the file doesn't exist but we can make new files in that dir
    elif [[ -w "$1" || ( -w $(dirname "$1") && ! -f "$1" ) ]]; then
        # \vim or 'vim' only escape aliases, not functions
        command vim "$1"
    else
        #this 'command' isn't required! It won't loop forever without it.
        sudo env HOME="$HOME" command vim -u $HOME/.vim/vimrc "$1"
    fi

我希望命令是必需的,否则vim 应该引用我创建的函数并将其自身称为无限。但是,不仅在 CentOS 和 Mac 系统上不需要,而且它还会导致 CentOS 机器上的功能失败!

谁能解释这种行为?

是否有一个方便的 bash 更改日志我可以查看以了解“命令”是否在 bash 4.1 之后才以某种方式实现?

【问题讨论】:

【参考方案1】:

sudo 需要一个可执行文件; command(通常)是一个内置的 shell,而不是可执行文件,它修改了 shell 如何执行其查找。 sudo vim 可以正常工作,因为 sudo 不能运行 shell 函数或使用名为 vim 的别名来隐藏 command vim 提供给您的可执行文件。

macOS 实际上确实 提供了一个 shell 脚本 /usr/bin/command(据我所知)似乎模拟了内置的 shell,同时补偿了 HFS+ 默认的不区分大小写.内置的command 将在bash 中隐藏它,但它可以从其他shell(或运行其他命令的命令,如sudo)获得。


POSIX 要求实现command,尽管不一定是内置的shell。为操作系统提供一个内置 command 的 shell 可能就足够了。 (POSIX 规范声明“命令实用程序最有可能作为常规内置提供。”,并继续列出command 未列在必须的其他命令中的一些原因> 是内置的。)

【讨论】:

为什么 sudo command vim 在我的 Mac 上运行 bash 4.4 呢?为什么 sudo 不能运行名为 vim 的 shell 函数? 刚刚更新了一个答案,我也很困惑。 它也适用于 Centos 7,它也有 /usr/bin/command。那么,sudo 不能运行内置函数,函数也不能运行,但是可执行文件/usr/bin/command 可以,这就是它在它所在的地方工作的原因吗? 正确。它最常被实现为内置的 shell,但它只需要 POSIX 标准可用。因此,符合 POSIX 的操作系统需要确保无论使用哪个 shell,它都可用。 它可能大部分兼容 POSIX,缺少始终可用的command 命令是一个阻止它完全兼容的错误.就像我说的,command 通常由 shell 实现(我真的不知道 没有 的那个),所以它的缺席通常不会被错过(除非你尝试使用它来自env,就像你在你的shell函数中所做的那样)。

以上是关于sudo:命令:在 CentOS 6 上找不到命令的主要内容,如果未能解决你的问题,请参考以下文章

在 Cygwin 上找不到 sudo 命令

CentOS6.6普通用户使用sudo命令借用root用户权限

Centos sudo命令执行python与普通用户执行python版本不同

sudo: pip: command not found in CentOS

如何修复 apt-get: 在 AWS EC2 上找不到命令? [关闭]

新创建的用户不能使用sudo 命令