Caminhos duplicados, problemas com .bash_profile

Aug 16 2020

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_profileainda 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 IDLE3ele 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_profilee 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_profilefinal, 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_profiledo final da primeira linha do meu .bash_profilenão o fez desaparecer, cuja saída echo $PATHpermaneceu inalterada.

Respostas

tripleee Aug 16 2020 at 14:21

Aqui está um reduzido e corrigido .bash_profileque é adequado para sua configuração.

Havia uma linha problemática no início onde ~/.bash_profilefoi 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 PATHmais 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 PATHvariá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.pysaveconté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.