Caminhos duplicados, problemas com .bash_profile
Fui direcionado aqui do Stack Overflow depois de postar uma pergunta sobre como fazer o PyExifTool funcionar. Parece, porém, que o problema era multifacetado e, sendo um novato, disseram-me para procurar ajuda aqui.
Essencialmente, o problema foi percebido quando me disseram para executar ...
bash:~ $ type -all exiftool
que voltou ...
exiftool is /usr/local/bin/exiftool
exiftool is /usr/local/bin/exiftool
... revelando que em algum lugar eu tinha duplicatas.
Posteriormente, eu corri ...
bash:~ $ echo $PATH
Que voltou ...
/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile
... que contém duplicatas e aparentemente não deve terminar com .bash_profile
Agora, no terminal, posso limpar isso usando ...
bash:~ $ PATH=$(echo $PATH | awk -v RS=: -v ORS=: '!($0 in a) {a[$0]; print}')
O texto acima é um trecho que obtive do Linux Journal que deve 'quase funcionar', mas o trecho de código que 'deveria funcionar' não parece me ajudar. Usar o código 'quase funcional' fornece o seguinte:
/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile :
Sou um novato absoluto, mas não acho que deveria terminar em :
e claramente o .bash_profile
ainda está presente. No entanto, parece remover duplicatas, embora isso seja redefinido se eu abrir uma nova janela de terminal, portanto, é apenas uma solução alternativa aguda.
Esta é a aparência do meu perfil bash:
export PATH=/usr/local/bin:$PATH~/.bash_profile # Setting PATH for Python 3.6 # The original version is saved in .bash_profile.pysave #PATH="/Library/Frameworks/Python.framework/Versions/3.6/bin:${PATH}"
#export PATH
# Setting PATH for Python 2.7
# The original version is saved in .bash_profile.pysave
#PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}" #export PATH # FSL Setup FSLDIR=/usr/local/fsl PATH=${FSLDIR}/bin:${PATH} export FSLDIR PATH . ${FSLDIR}/etc/fslconf/fsl.sh
# Setting PATH for Python 3.8
# The original version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"
export PATH
Não tenho certeza se isso é relevante ou relacionado, mas quando lanço o python no meu Hotbar e executo ...
>>> print(os.environ['PATH'])
Imprime
/usr/bin:/bin:/usr/sbin:/sbin
Ao passo que quando eu o lanço do meu terminal bash usando IDLE3
ele retorna:
/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile
Informação Periférica e Experimentação:
Acho que provavelmente baguncei alguma coisa ao instalar o FSL, fiz algo no meu .bash_profile
e agora estou sendo assombrado enquanto tento aprender e desenvolver habilidades básicas de codificação. Talvez tenha sido um erro manual ou talvez tenha algo a ver com homebrew ou Xcode.
Eu poderia deletar o .bash_profile
final, mas estou preocupado porque já causei danos o suficiente e não quero resolver um problema tão trabalhoso que nenhum fórum da internet quer mexer nele.
Isso é o que deveria funcionar de acordo com Mitch Frazier do Linux Journal . Obviamente, isso não é uma reflexão sobre ele ou o artigo, mas sim sobre minha compreensão limitada.
bash:~ $ export PATH=/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile
bash:~ $ echo -n $PATH | awk -v RS=: '!($0 in a) {a[$0]; printf("%s%s", length(a) > 1 ? ":" : "", $0)}'
Isso retorna ...
/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profileUser's-MBP:~ username$
Também tentei o seguinte (sugerido por pepa65 ) ...
bash:~ $ PATH=$(n= IFS=':'; for e in $PATH; do [[ :$n == *:$e:* ]] || n+=$e:; done; echo "${n:0: -1}")
Isso retorna ...
-bash: -1: substring expression < 0
Quando tento procurar mudanças usando echo $PATH
...
Recebo uma linha em branco.
Sei que é improvável que isso seja intelectualmente estimulante, então sou grato por qualquer ajuda.
EDIT 1:
Uma tentativa ingênua de remover .bash_profile
do final da primeira linha do meu .bash_profile
não o fez desaparecer, cuja saída echo $PATH
permaneceu inalterada.
Respostas
Aqui está um reduzido e corrigido .bash_profile
que é adequado para sua configuração.
Havia uma linha problemática no início onde ~/.bash_profile
foi adicionada erroneamente a uma linha correta. No entanto, removi a linha inteira, pois seria de esperar, e seus diagnósticos sugerem, que ela estava adicionando um diretório que já estava no padrão fornecido pelo sistema PATH
.
Definitivamente, não há necessidade de export PATH
mais de uma vez; provavelmente você pode remover com segurança até mesmo a única instância restante. O significado de export
é marcar uma variável a ser transformada em uma variável de ambiente que é visível para os subprocessos. Depois de fazer isso, os subprocessos terão acesso ao valor atual da variável, mesmo se o valor mudar depois de export
. Muito provavelmente a configuração do shell de todo o sistema já faz isso para a PATH
variável (caso contrário, não poderia funcionar como pretendido).
Eu removi seções inteiras que foram comentadas; é claro que você pode querer trazê-los de volta e removê-los.
# FSL Setup
FSLDIR=/usr/local/fsl
PATH=${FSLDIR}/bin:${PATH}
export FSLDIR PATH
. ${FSLDIR}/etc/fslconf/fsl.sh # Setting PATH for Python 3.8 # The original version is saved in .bash_profile.pysave PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"
Este arquivo é lido quando você inicia um novo shell, embora a hora exata também dependa de como seu fornecedor de sistema operacional configurou o Bash. Para ter certeza de que qualquer configuração antiga não está mais interferindo em sua configuração atual, você terá que descobrir se é necessário fazer o logout e voltar a iniciar novamente, ou se você pode simplesmente iniciar um novo shell ou uma nova sessão de terminal para obter uma ficha limpa.
Talvez ainda revise se .bash_profile.pysave
contém algo útil que você deseja manter, embora eu espere que seja em geral idêntico à sua versão atual, exceto pelo último conjunto de linhas.