Zduplikowane ścieżki, problemy z .bash_profile

Aug 16 2020

Zostałem skierowany tutaj z Stack Overflow po opublikowaniu pytania o problemach z uruchomieniem PyExifTool. Wydaje się jednak, że problem był wieloaspektowy i będąc nowicjuszem kazano mi tu szukać pomocy.

Zasadniczo problem został rozwiązany, gdy kazano mi biec ...

bash:~ $ type -all exiftool

który wrócił ...

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

... ujawniając, że gdzieś mam duplikaty.

Następnie pobiegłem ...

bash:~ $ echo $PATH

Który wrócił ...

/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

... który zawiera duplikaty i najwyraźniej nie powinien kończyć się na .bash_profile

Teraz w terminalu mogę to wyczyścić za pomocą ...

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

Powyższe to fragment kodu, który otrzymałem z Linux Journal, który ma „prawie działać”, ale fragment kodu, który „powinien działać”, nie wydaje mi się pomagać. Użycie „prawie funkcjonalnego” kodu daje następujące efekty:

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

Jestem zupełnym nowicjuszem, ale nie sądzę, żeby miało się to skończyć :i najwyraźniej .bash_profilenadal jest obecne. Wydaje się jednak, że usuwa duplikaty, chociaż resetuje się, gdy otwieram nowe okno terminala, więc jest to tylko ostre obejście.

Tak wygląda mój profil 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

Nie jestem pewien, czy jest to istotne lub powiązane, ale kiedy uruchamiam Pythona z mojego paska Hotbar i uruchamiam ...

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

To drukuje

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

Natomiast kiedy uruchamiam go z mojego terminala bash używając IDLE3go zwraca:

/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

Informacje peryferyjne i eksperymenty:

Wydaje mi się, że prawdopodobnie coś zepsułem podczas instalowania FSL, zrobiłem coś ze swoim .bash_profilei teraz jestem nawiedzony, próbując nauczyć się i rozwijać podstawowe umiejętności kodowania. Może to był błąd ręczny, a może miał coś wspólnego z homebrew lub Xcode.

Mogę usunąć .bash_profilezakończenie, ale obawiam się, że zrobiłem już wystarczająco dużo szkód i nie chcę rozwiązywać problemu tak pracochłonnego, że żadne forum internetowe nie chce go dotykać.

Tak właśnie miało działać według Mitcha Fraziera z Linux Journal . Oczywiście nie jest to refleksja na jego temat ani na artykuł, ale raczej na moim ograniczonym zrozumieniu.

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

To wraca ...

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

Wypróbowałem również następujące (sugerowane przez pepa65 ) ...

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

To wraca ...

-bash:  -1: substring expression < 0

Kiedy próbuję szukać zmian za pomocą echo $PATH...

Otrzymuję pustą linię.

Wiem, że to raczej nie stymuluje intelektualnie, więc jestem wdzięczny za jakąkolwiek pomoc.

EDYCJA 1:

Naiwna próba usunięcia .bash_profilez końca pierwszej linijki mojego .bash_profilenie sprawiła, że ​​zniknął on z wyjścia echo $PATHktórego pozostał bez zmian.

Odpowiedzi

tripleee Aug 16 2020 at 14:21

Tutaj jest zredukowany i poprawiony, .bash_profilektóry jest, mam nadzieję, odpowiedni dla twojej konfiguracji.

Na początku była problematyczna linia, ~/.bash_profilektóra została błędnie dodana do innej poprawnej linii. Jednak usunąłem całą linię, ponieważ spodziewałem się, a Twoja diagnostyka sugeruje, że dodawałem katalog, który był już domyślnym katalogiem dostarczonym przez system PATH.

Zdecydowanie nie ma potrzeby export PATHwięcej niż raz; prawdopodobnie mógłbyś bezpiecznie usunąć nawet jedną pozostałą instancję. Znaczenie exportpolega na zaznaczeniu zmiennej, która ma zostać przekształcona w zmienną środowiskową , która jest widoczna dla podprocesów. Gdy to zrobisz, podprocesy będą miały dostęp do bieżącej wartości zmiennej, nawet jeśli wartość zmieni się po export. Całkiem prawdopodobnie twoja ogólnosystemowa konfiguracja powłoki już to robi dla PATHzmiennej (w przeciwnym razie nie mogłaby działać zgodnie z przeznaczeniem).

Usunąłem całe sekcje, które zostały zakomentowane; możesz oczywiście chcieć je przywrócić i odkomentować.

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

Ten plik jest odczytywany podczas uruchamiania nowej powłoki, ale kiedy dokładnie będzie zależeć również od tego, jak dostawca systemu operacyjnego skonfigurował Bash. Aby mieć całkowitą pewność, że żadna stara konfiguracja nie koliduje już z bieżącą konfiguracją, będziesz musiał dowiedzieć się, czy wylogowanie się i ponowne zalogowanie jest wymagane, aby zacząć od nowa, czy możesz po prostu uruchomić nową powłokę lub nową sesję terminala, aby zdobądź czystą kartę.

Być może nadal sprawdzaj, czy .bash_profile.pysavezawiera coś przydatnego, co chcesz zachować, chociaż spodziewam się, że będzie w zasadzie identyczny z twoją obecną wersją, z wyjątkiem ostatniego zestawu wierszy.