Команда sudo: команда: не найдена в CentOS 6 - PullRequest
0 голосов
/ 01 ноября 2018

MVCE:

на bash 4.1.2, Centos 6.10 (потому что мы монстры).

sudo command vim

возвращает

sudo: command: command not found

Я не понимаю, почему. на bash 4.4.23, Mac OS High Sierra работает как положено. Гуглить очень сложно, поскольку люди используют «команду» в качестве заполнителя для различных команд, о которых они говорят.

Актуальная проблема:

У меня есть функция (см. Ниже) с именем 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 Ответ

0 голосов
/ 01 ноября 2018

sudo ожидает исполняемый файл; command - это (обычно) встроенная оболочка, а не исполняемый файл, который изменяет способ поиска оболочки. sudo vim будет работать нормально, потому что sudo не может запустить функцию оболочки или использовать псевдоним с именем vim, который затеняет исполняемый файл, который даст вам command vim.

macOS на самом деле предоставляет сценарий оболочки /usr/bin/command, который (насколько я могу судить), по-видимому, имитирует встроенную оболочку, компенсируя нечувствительность к регистру, которой HFS + по умолчанию соответствует. Встроенный command будет затенять его в bash, но он будет доступен из других оболочек (или из команд, запускающих другие команды, например sudo).


POSIX требует, чтобы command был реализован, хотя не обязательно как встроенная оболочка. Предоставление оболочки с command в качестве встроенного, вероятно, достаточно для ОС. (Спецификация POSIX гласит: «Утилита команд, скорее всего, будет предоставлена ​​как обычная встроенная программа», и переходит к перечислению некоторых причин, по которым command не указан среди других команд, которые должны . быть встроенными.)

...