Yinelenen Yollar, .bash_profile ile ilgili sorunlar

Aug 16 2020

PyExifTool'u çalıştırmak için mücadele etmekle ilgili bir soru gönderdikten sonra buraya Stack Overflow'dan yönlendirildim . Bununla birlikte, sorun çok yönlü görünüyordu ve acemi olduğum için burada yardım istemem söylendi.

Esasen sorun bana kaçmam söylendiğinde anlaşıldı ...

bash:~ $ type -all exiftool

geri döndü ...

exiftool is /usr/local/bin/exiftool
exiftool is /usr/local/bin/exiftool

... bir yerlerde kopyalarım olduğunu ortaya çıkarıyor.

Daha sonra koştum ...

bash:~ $ echo $PATH

Hangi geri döndü ...

/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

... kopyalar içeren ve görünüşe göre bitmemesi gereken .bash_profile

Şimdi terminalde, bunu kullanarak temizleyebilirim ...

bash:~ $ PATH=$(echo $PATH | awk -v RS=: -v ORS=: '!($0 in a) {a[$0]; print}')

Yukarıdakiler, Linux Journal'dan aldığım ve 'neredeyse çalışıyor' olması beklenen bir kod parçacığı, ancak 'çalışması gereken' kod parçası bana yardımcı olmuyor gibi görünüyor. 'Neredeyse işlevsel' kodu kullanmak şunları verir:

/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 :

Ben tamamen acemiyim ama bunun bitmesi gerektiğini düşünmüyorum :ve açıkça .bash_profilehala mevcut. Ancak, kopyaları kaldırıyor gibi görünüyor, ancak yeni bir terminal penceresi açarsam bu sıfırlanır, bu nedenle yalnızca akut bir çözümdür.

Bash profilim şöyle görünüyor:

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

Bunun alakalı mı yoksa ilgili mi olduğundan emin değilim ama Hotbar'ımdan python başlatıp çalıştırdığımda ...

>>> print(os.environ['PATH'])

Yazdırır

/usr/bin:/bin:/usr/sbin:/sbin

Oysa onu kullanarak IDLE3onu bash terminalimden başlattığımda geri dönüyor:

/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

Çevresel Bilgi ve Deney:

FSL'yi kurarken muhtemelen bir şeyleri mahvettiğimi, kendime bir şey yaptığımı .bash_profileve temel kodlama becerilerini öğrenmeye ve geliştirmeye çalışırken şimdi perili olduğumu düşünüyorum . Belki manuel bir hataydı veya belki de homebrew veya Xcode ile bir ilgisi vardı.

Sonunu silebilirdim .bash_profileama zaten yeterince zarar verdim ve kendimi o kadar zahmetli bir soruna gidermek istemiyorum ki hiçbir internet forumuna dokunmak istemiyorum.

Linux Journal'dan Mitch Frazier'e göre çalışması gereken şey buydu . Açıkçası bu onun ya da makalenin bir yansıması değil, benim sınırlı anlayışımla ilgili.

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)}'

Bu geri dönüyor ...

/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$

Aşağıdakileri de denedim ( pepa65 tarafından önerildi ) ...

bash:~ $ PATH=$(n= IFS=':'; for e in $PATH; do [[ :$n == *:$e:* ]] || n+=$e:; done; echo "${n:0: -1}")

Bu geri dönüyor ...

-bash:  -1: substring expression < 0

Şunu kullanarak değişiklikleri aramaya çalıştığımda echo $PATH...

Boş bir satır alıyorum.

Bunun entelektüel olarak uyarıcı olma ihtimalinin düşük olduğunu biliyorum, bu yüzden herhangi bir yardım için minnettarım.

DÜZENLEME 1:

İlk satırımın .bash_profilesonundan uzaklaşmaya yönelik naif bir girişim, .bash_profileonun çıktısının echo $PATHdeğişmeden kaldığı yerden kaybolmasına neden olmadı .

Yanıtlar

tripleee Aug 16 2020 at 14:21

Burada, .bash_profileyapılandırmanız için tamamen yeterli olan azaltılmış ve düzeltilmiş bir örnek verilmiştir.

Başlangıçta ~/.bash_profile, aksi takdirde doğru olan bir satıra yanlışlıkla eklenmiş sorunlu bir çizgi vardı. Ancak, beklediğimden ve tanılamanızda önerdiğinden, tüm satırı kaldırdım, zaten sistem tarafından sağlanan varsayılanta olan bir dizin ekliyordu PATH.

Bir export PATHkereden fazlasına kesinlikle gerek yoktur ; Muhtemelen kalan bir örneği bile güvenle kaldırabilirsiniz. Bunun anlamı, alt süreçler tarafından görülebilen exportbir ortam değişkenine yapılacak bir değişkeni işaretlemektir . Bunu yaptıktan sonra, alt işlemler değişkenin mevcut değerine erişebilir export,. Muhtemelen sistem çapındaki kabuk yapılandırmanız bunu PATHdeğişken için zaten yapıyor (aksi takdirde amaçlandığı gibi çalışamaz).

Yorumlanan tüm bölümleri kaldırdım; elbette onları geri getirmek ve yorum yapmamak isteyebilirsiniz.

# 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}"

Bu dosya, yeni bir kabuk başlattığınızda okunur, ancak tam olarak ne zaman işletim sistemi satıcınızın Bash'i nasıl yapılandırdığına da bağlı olacaktır. Herhangi bir eski yapılandırmanın artık mevcut yapılandırmanıza müdahale etmediğinden tamamen emin olmak için, yeniden başlamak için oturumu kapatıp tekrar açmanız gerekip gerekmediğini veya yeni bir kabuk veya yeni bir terminal oturumu başlatıp başlatamayacağınızı anlamanız gerekecektir. temiz bir sayfa bul.

Muhtemelen .bash_profile.pysavesaklamak isteyeceğiniz yararlı bir şey içerip içermediğini hala gözden geçirin, ancak bunun son satır grubu dışında mevcut sürümünüzle büyük ölçüde aynı olmasını beklerdim.