Я столкнулся с проблемой, когда выполнение общих команд 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