Повторяющиеся пути, проблемы с .bash_profile
Меня направили сюда из 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
которой остался без изменений.
Ответы
Вот сокращенный и исправленный, .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
содержит ли что-то полезное, что вы хотите сохранить, хотя я ожидаю, что он будет в целом идентичен вашей текущей версии, за исключением самого последнего набора строк.