Назад | Перейти на главную страницу

Команды Bash не найдены после синтаксической ошибки

Я столкнулся с проблемой, когда выполнение общих команд bash (например, ls, mv, rsync, vi) на Ubuntu 14.04.5 LTS приводит к примерно следующему: bash: rsync: command not found.

Когда я использую ssh, я получаю эту ошибку (перед запуском любых команд в оболочке):

awk: cmd. line:1: //home/myuser/.pythonbrew/ {next} {print} awk: cmd. line:1: ^ syntax error

Мне удалось исправить проблему, закомментировав эти строки в ~/.bash_profile и ~/.bashrc файлы, относящиеся к настройке python и pythonbrew:

export PATH=~/opt/python-2.7.3/bin:${PATH} export PYTHONPATH=~/opt/python-2.7.3/lib alias pb='pythonbrew' export PYTHONPATH=~/.pythonbrew/pythons/Python-2.7.3/lib [[ -s /home/myuser/.pythonbrew/etc/bashrc ]] && source /home/myuser/.pythonbrew/etc/bashrc

Однако эти строки вряд ли могут быть основной причиной, поскольку эти файлы не менялись годами (а команды bash перестали работать только в последние несколько дней).

Мысли?


Содержание ~/.pythonbrew/etc/bashrc

# settings
PATH_ROOT="$PYTHONBREW_ROOT"
if [ -z "${PATH_ROOT}" ] ; then
    PATH_ROOT="$HOME/.pythonbrew"
fi
PATH_ETC="$PATH_ROOT/etc"

PATH_HOME="$PYTHONBREW_HOME"
if [ -z "${PATH_HOME}" ] ; then
    PATH_HOME="$HOME/.pythonbrew"
fi
PATH_HOME_ETC="$PATH_HOME/etc"

# py file
PY_PYTHONBREW="$PATH_ROOT/bin/pythonbrew"

# functions
__pythonbrew_set_default()
{
    PATH_PYTHONBREW="$PATH_ROOT/bin"
    PATH_PYTHONBREW_LIB="$PATH_ROOT/lib"
}

__pythonbrew_set_path()
{
    PATH_WITHOUT_PYTHONBREW=$(printf "$PATH" | awk -v RS=: -v ORS=: "/${PATH_ROOT//\//\/}/ {next} {print}" | sed -e 's#:$##')
    export PATH=$PATH_PYTHONBREW:$PATH_WITHOUT_PYTHONBREW
    export PYTHONPATH=$PATH_PYTHONBREW_LIB
}

__pythonbrew_set_temp_path()
{
    if [[ -s "$PATH_HOME_ETC/temp" ]] ; then
        source "$PATH_HOME_ETC/temp"
        PATH_PYTHONBREW="$PATH_ROOT/bin:$PATH_PYTHONBREW_TEMP"
        PATH_PYTHONBREW_LIB="$PATH_PYTHONBREW_TEMP_LIB"
    else
        __pythonbrew_set_default
    fi
    __pythonbrew_set_path
}

__pythonbrew_set_current_path()
{
    if [[ -s "$PATH_HOME_ETC/current" ]] ; then
        source "$PATH_HOME_ETC/current"
        PATH_PYTHONBREW="$PATH_ROOT/bin:$PATH_PYTHONBREW_CURRENT"
        PATH_PYTHONBREW_LIB="$PATH_PYTHONBREW_CURRENT_LIB"
    else
        __pythonbrew_set_default
    fi
    __pythonbrew_set_path
}

__pythonbrew_reload()
{
    [[ -s "$PATH_ETC/bashrc" ]] && source "$PATH_ETC/bashrc"
}

__pythonbrew_use()
{
    [[ $? == 0 ]] && __pythonbrew_set_temp_path
}

__pythonbrew_switch()
{
    [[ $? == 0 ]] && __pythonbrew_set_current_path
}

__pythonbrew_off()
{
    [[ $? == 0 ]] && __pythonbrew_set_current_path
}

__pythonbrew_update()
{
    [[ $? == 0 ]] && __pythonbrew_reload
}

__pythonbrew_venv()
{
    if [[ $? == 0 ]] ; then
        if [[ -s "$PATH_HOME_ETC/venv.run" ]] ; then
            source "$PATH_HOME_ETC/venv.run"
            cat /dev/null > "$PATH_HOME_ETC/venv.run"
        fi
    fi
}

__pythonbrew_find_command()
{
    command_name=""
    for arg in "$@" ; do
        case $arg in
            --*) continue;;
            -*) continue;;
            *)
            command_name=$arg
            break
            ;;
        esac
    done
}

__pythonbrew_run()
{
    __pythonbrew_find_command "$@"
    "$pythonbrew" "$@"
    case $command_name in
        use) __pythonbrew_use "$@";;
        switch) __pythonbrew_switch "$@" ;;
        off) __pythonbrew_off "$@" ;;
        update) __pythonbrew_update "$@" ;;
        venv) __pythonbrew_venv "$@" ;;
    esac
    builtin hash -r
}

pythonbrew()
{
    pythonbrew=$PY_PYTHONBREW
    __pythonbrew_run "$@"
}

pybrew()
{
    pythonbrew "$@"
}

sudopybrew()
{
    pythonbrew="sudo PYTHONBREW_ROOT=$PATH_ROOT PATH=$PATH_PYTHONBREW:$PATH_WITHOUT_PYTHONBREW $PY_PYTHONBREW"
    __pythonbrew_run "$@"
}

# main
__pythonbrew_set_current_path

Я могу сказать тебе, что происходит, но я не уверен Зачем это происходит. Вы только что установили новую версию bash? Насколько я понимаю, причиной должно быть небольшое изменение в том, как bash анализирует определенные подстановки. Кстати, я также сделаю некоторые предположения о том, как это исправить, но, не понимая первопричины, они просто догадки.

Проблема возникает в __pythonbrew_set_path функция в ~ / .pythonbrew / etc / bashrc:

__pythonbrew_set_path()
{
    PATH_WITHOUT_PYTHONBREW=$(printf "$PATH" | awk -v RS=: -v ORS=: "/${PATH_ROOT//\//\/}/ {next} {print}" | sed -e 's#:$##')
    export PATH=$PATH_PYTHONBREW:$PATH_WITHOUT_PYTHONBREW
    export PYTHONPATH=$PATH_PYTHONBREW_LIB
}

Что это предполагаемый сделать это взять свой текущий PATH (printf "$PATH") удалите все ссылки на каталог python brew ( awk команду), удалите лишний ":", добавленный в конец ( sed команда, сохраните это в PATH_WITHOUT_PYTHONBREW, затем установите новый PATH содержащий PATH_PYTHONBREW плюс очищенный старый PATH.

На самом деле происходит синтаксическая ошибка в awk команда, поэтому она ничего не выводит, поэтому PATH_WITHOUT_PYTHONBREW оказывается полностью пустым, поэтому фактически все, кроме PATH_PYTHONBREW удален из вашего PATH.

Причина awk команда терпит неудачу в том, что ${PATH_ROOT//\//\/} не делает то, что должно. Это должно занять PATH_ROOT (путь к вашему каталогу пивоварения python, "/home/myuser/.pythonbrew/") и добавьте escape-символы перед каждым /. Вот пример того, как это должен работать:

$ PATH_ROOT="/home/myuser/.pythonbrew/"
$ printf "%s\n" "${PATH_ROOT//\//\/}"
\/home\/myuser\/.pythonbrew\/

Если вы попробуете это в своей оболочке, я думаю, вместо этого он напечатает "/home/myuser/.pythonbrew/" (без выходов). Вы можете увидеть эту строку (неэкранированную версию) в awk сообщение об ошибке, которое вы получили. Причина, по которой это вызывает awk ошибка в том, что awk использует / отмечать начало и конец поискового шаблона; когда они происходят в начале и в конце и средний (без побегов), запуталась.

Так почему нет ${PATH_ROOT//\//\/} добавление побегов? Вот где я в тупике. Я предполагаю, что это связано с изменением того, как bash анализирует подстановку здесь. Вот как это должен читать bash: возьмите значение переменной (PATH_ROOT) и замените все (//) появления символа косой черты (\/ - обратите внимание, что он экранирован, поэтому его не принимают за конец шаблона) с помощью (/ - этот не сбежал, потому что он является конец узора) строка \/ (\/).

Моим первым предположением было бы то, что по какой-то причине bash удаляет escape-символы перед "/" в строке замены, как это делается в заменяемом шаблоне. В этом случае добавление дополнительного escape-символа в заменяющую строку должно исправить это. Попробуйте это в своей оболочке:

$ PATH_ROOT="/home/myuser/.pythonbrew/"
$ printf "%s\n" "${PATH_ROOT//\//\\/}"
\/home\/myuser\/.pythonbrew\/

В моем случае он делает то же самое, что и первый; если он работает (добавляет экранирование) в вашем, добавьте соответствующую обратную косую черту к awk в ~ / .pythonbrew / etc / bashrc, и все будет в порядке. Если нет, попробуйте эти команды и дайте мне знать, что ваша оболочка делает с ними (я включил вывод моей оболочки для сравнения):

$ PATH_ROOT="/home/myuser/.pythonbrew/"
$ printf "%s\n" "${PATH_ROOT//\//A}" "${PATH_ROOT////A}" "${PATH_ROOT//o/\/}" "${PATH_ROOT//o/\\/}"
AhomeAmyuserA.pythonbrewA
AhomeAmyuserA.pythonbrewA
/h\/me/myuser/.pyth\/nbrew/
/h\/me/myuser/.pyth\/nbrew/

Похоже, ваш путь засоряется командой экспорта python. Попробуйте поместить в конец материал питона.

ИЗМЕНИТЬ ЭТО:

export PATH=~/opt/python-2.7.3/bin:${PATH}

К ЭТОМУ:

export PATH=$PATH:~/opt/python-2.7.3/bin

Похоже, вы создали скрипт в Windows с новой строкой Windows.

Сохраните скрипт как файл Unix или создайте

dos2unix < script_dos.sh > script_unix.sh