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

问题描述 投票:0回答:1

MVCE:

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

sudo command vim

回报

sudo: command: command not found

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

实际问题:

我有一个名为vim的函数(见下文),从调用vim中取出command不会导致它失败,就像我期望的那样,在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 changelog我可以看看知道“命令”是否在bash 4.1之后才实现?

bash centos6
1个回答
2
投票

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没有列在必须内置的其他命令中的一些原因。)

© www.soinside.com 2019 - 2024. All rights reserved.