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/