Bem, eu posso lhe dizer o que está acontecendo, mas não tenho certeza porque está acontecendo. Você acabou de instalar uma nova versão do bash? Até onde eu posso ver, a causa tem que ser uma pequena mudança na forma como bash analisa certas substituições. BTW, eu também vou fazer algumas suposições sobre como consertá-lo, mas sem entender a causa raiz são apenas suposições.
O problema está ocorrendo na função __pythonbrew_set_path em ~ / .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
}
O que é suposto que fazer é pegar o seu atual PATH ( printf "$PATH" ), remover todas as referências ao diretório brew do python (o comando awk ), remover um ":" perdido que foi adicionado ao final (o comando sed , armazene em PATH_WITHOUT_PYTHONBREW e defina um novo PATH contendo PATH_PYTHONBREW mais o antigo PATH limpo.
O que realmente está acontecendo é que há um erro de sintaxe no comando awk , portanto, não está gerando nada, portanto PATH_WITHOUT_PYTHONBREW acaba completamente em branco, então tudo, exceto PATH_PYTHONBREW , é removido de seu PATH . / p>
A razão pela qual o comando awk falha é que ${PATH_ROOT//\//\/} não está fazendo o que deveria. É suposto ter o PATH_ROOT (o caminho para o seu diretório python brew, "/home/myuser/.pythonbrew/") e adicionar fugas antes de cada / . Aqui está um exemplo de como deve operar:
$ PATH_ROOT="/home/myuser/.pythonbrew/"
$ printf "%s\n" "${PATH_ROOT//\//\/}"
\/home\/myuser\/.pythonbrew\/
Se você tentar isso no seu shell, eu acho que vai imprimir "/home/myuser/.pythonbrew/" (sem escapes). Você pode ver essa string (a versão sem escape) na mensagem de erro awk que você recebeu. A razão pela qual isso causa um erro awk é que awk usa / para marcar o início e o fim de um padrão de pesquisa; quando eles ocorrem no começo e no final e no meio (sem fugas), fica confuso.
Então, por que ${PATH_ROOT//\//\/} não é adicionado? É aqui que estou perplexo Meu melhor palpite é que é devido a uma mudança em exatamente como bash analisa a substituição aqui. Veja como o bash deve lê-lo: pegue o valor da variável ( PATH_ROOT ) e substitua todas as ocorrências ( // ) de um caractere de barra ( \/ - observe que ele escapou, portanto não é confundido com o final de o padrão) com ( / - este não escapou porque é o final do padrão) a string \/ ( \/ ).
Meu primeiro palpite seria que, por algum motivo, bash está removendo escapes antes de "/" na cadeia de substituição, como faz no padrão a ser substituído. Se for esse o caso, adicionar um escape extra à string de substituição deve corrigi-lo. Tente isso no seu shell:
$ PATH_ROOT="/home/myuser/.pythonbrew/"
$ printf "%s\n" "${PATH_ROOT//\//\/}"
\/home\/myuser\/.pythonbrew\/
No meu faz o mesmo que o primeiro; se funcionar (adiciona escapes) no seu, adicione a barra invertida correspondente ao comando awk em ~ / .pythonbrew / etc / bashrc e você deve estar pronto. Se não, tente estes comandos e deixe-me saber o que o seu shell faz com eles (incluí a saída do meu shell para comparação):
$ 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/