Повторяющиеся пути, проблемы с .bash_profile

Aug 16 2020

Меня направили сюда из Stack Overflow после публикации вопроса о том, как заставить PyExifTool работать. Однако похоже, что проблема была многогранной, и, будучи новичком, мне посоветовали обратиться за помощью сюда.

По сути, проблема осозналась, когда мне сказали бежать ...

bash:~ $ type -all exiftool

который вернулся ...

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

... обнаруживая, что где-то у меня были дубликаты.

Впоследствии я побежал ...

bash:~ $ echo $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_profile

Теперь в терминале я могу очистить это, используя ...

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

Приведенный выше фрагмент кода, который я получил из Linux Journal , должен «почти работать», но фрагмент кода, который «должен работать», похоже, мне не помогает. Использование «почти функционального» кода дает следующее:

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

Я полный новичок, но я не думаю, что это должно закончиться, :и ясно, что .bash_profileон все еще присутствует. Тем не менее, похоже, что он удаляет дубликаты, хотя он сбрасывается, если я открываю новое окно терминала, так что это только острый обходной путь.

Вот как выглядит мой профиль на 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

Я не уверен, актуально ли это или связано с этим, но когда я запускаю python со своего Hotbar'а и запускаю ...

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

Он печатает

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

Тогда как, когда я запускаю его с моего терминала bash, IDLE3он возвращает:

/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

Периферийная информация и эксперименты:

Я думаю, что, вероятно, что-то напутал при установке FSL, что-то сделал со своим, .bash_profileи теперь меня преследуют, когда я пытаюсь изучить и развить базовые навыки программирования. Возможно, это была ручная ошибка или, возможно, это было связано с homebrew или Xcode.

Я мог бы удалить .bash_profileконцовку, но меня беспокоит, что я уже нанес достаточно вреда, и не хочу вливать себя в проблему, настолько трудоемкую, что ни один интернет-форум не хочет ее касаться.

Это то, что должно было работать, по словам Митча Фрейзера из Linux Journal . Очевидно, это не размышления о нем или статье, а скорее о моем ограниченном понимании.

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

Это возвращается ...

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

Я также пробовал следующее (предложено pepa65 ) ...

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

Это возвращается ...

-bash:  -1: substring expression < 0

Когда я пытаюсь найти изменения, используя echo $PATH...

У меня пустая строка.

Я знаю, что это вряд ли будет стимулировать интеллектуальное развитие, поэтому благодарен за любую помощь.

РЕДАКТИРОВАТЬ 1:

Наивная попытка убрать .bash_profileс конца мою первую строчку .bash_profileне заставила ее исчезнуть, вывод echo $PATHкоторой остался без изменений.

Ответы

tripleee Aug 16 2020 at 14:21

Вот сокращенный и исправленный, .bash_profileкоторый, надеюсь, адекватен вашей конфигурации.

В начале была проблемная строка, которая ~/.bash_profileбыла ошибочно добавлена ​​к правильной строке. Тем не менее, я удалил всю строку, так как я ожидал, и ваша диагностика предполагает, что она добавляла каталог, который уже был в системе по умолчанию PATH.

Однозначно нет необходимости делать это export PATHболее одного раза; вероятно, вы могли бы безопасно удалить даже один оставшийся экземпляр. Смысл в exportтом, чтобы пометить переменную, которая будет преобразована в переменную среды , видимую для подпроцессов. Как только вы это сделаете, подпроцессы получат доступ к текущему значению переменной, даже если значение изменится после 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}"

Этот файл читается, когда вы запускаете новую оболочку, хотя когда именно, также будет зависеть от того, как поставщик вашей ОС настроил Bash. Чтобы быть полностью уверенным, что какая-либо старая конфигурация больше не мешает вашей текущей конфигурации, вам нужно будет выяснить, требуется ли выход из системы и повторный вход, чтобы начать все сначала, или вы можете просто запустить новую оболочку или новый сеанс терминала, чтобы получить чистый лист.

Возможно, все еще просмотрите, .bash_profile.pysaveсодержит ли что-то полезное, что вы хотите сохранить, хотя я ожидаю, что он будет в целом идентичен вашей текущей версии, за исключением самого последнего набора строк.