Изменчивый гm trying to set my path to look like this:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/jgrande/android-sdk-linux/platform-tools:/usr/lib/jvm/java-7-openjdk-amd64/bin/:/usr/lib/jvm/java-7-openjdk-amd64/jre/bin
And for some reasons, не matter what file I edit, the переменная always ends up looking like this (with the java path repeating в bunch of укради):
PATH=/usr/local/java/jdk1.7.0_79/bin:/home/jgrande/bin:/usr/local/java/jdk1.7.0_79/bin:/home/jgrande/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/java/jdk1.7.0_79/bin:/usr/local/java/jdk1.7.0_79/jre/bin:/usr/local/java/jdk1.7.0_79/bin:/usr/local/java/jdk1.7.0_79/jre/bin
Личный гve tried to edit my .bashrc
and .profile
эксперт well схвати /etc/environment
, /etc/bash.bashrc
, /etc/profile
, and set it in /etc/profile.d
. Now, there is jdk.sh
in /etc/profile.d
where the изменчивый PATH is identical to the incorrect one I posted above. However, I tried to comment out the line and even remove jdk.sh
altogether and that still didn't fix it.
Otherwise, гve noticed that if I log in another user эксперт, гll have the correct изменчивый PATH, and don't have the messed up one with java being repeated в bunch of укради.
So, I was wondering, where else could my изменчивый PATH be defined that I haven't checked yet?
Чтобы найти все места, где изменяется переменная окружения $PATH
, используйте следующее:
sudo grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e "PATH="
Это позволит искать все каталоги в вашей системе, исключая каталоги виртуальной файловой системы. В моем случае с тремя смонтированными дистрибутивами будет возвращено 697 файлов.
Более целенаправленным подходом для OP является поиск конкретного имени пути. Вы можете искать программу, которая задает необычную часть $PATH, содержащую:
/usr/local/java/jdk1.7.0_79/bin
Запустите ее в терминале:
sudo grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e "/usr/local/java/jdk1.7.0_79/bin"
Если первый каталог в $PATH не является виновником, то поищите последний:
/usr/lib/jvm/java-7-openjdk-amd64/jre/bin
grep
вернет имя скрипта / файла, который устанавливает $PATH.
ПУТЬ можно задать в любом из различных файлов, которые bash читает при запуске. Чтобы найти их все, выполните следующее:
grep --color -H 'PATH=' ~/.bashrc ~/.profile ~/.bash_profile ~/bash.login \
~/.bash_aliases /etc/bash.bashrc /etc/profile \
/etc/profile.d/* /etc/environment 2> /dev/null
Это стандартные. Если вы также получаете другие файлы из одного из них, все может стать более сложным.
В любом случае, чтобы исправить это - при условии, что вы ничего не сделали с глобальными файлами в / etc /
- вы можно запустить это:
sed -i '/PATH=/d' ~/.bashrc ~/.profile ~/.bash_profile ~/bash.login ~/.bash_aliases
Это удалит все строки, устанавливающие PATH
из этих файлов. Теперь добавьте нужный в нужное место:
pp='PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/jgrande/android-sdk-linux/platform-tools:/usr/lib/jvm/java-7-openjdk-amd64/bin/:/usr/lib/jvm/java-7-openjdk-amd64/jre/bin'
[[ -e '~/.bash_profile' ]] && echo "$pp" >> ~/bash_profile ||
echo "$pp" >> ~/.profile
При вызове в качестве оболочки входа в систему bash читает .bash_profile
, если он присутствует, а если нет, то читает ~ / .profile
(он проигнорирует .profile
, если присутствует .bash_login
, но я предполагаю, что это не так). Таким образом, приведенные выше команды сначала сохранят желаемый путь как $ pp
, а затем проверит, существует ли ~ / .bash_profile
, добавьте к нему определение пути, если оно есть, и, если оно нет, он добавит его в ~ / .profile
.
В будущем, чтобы избежать подобной проблемы, используйте функцию для добавления каталогов в ваш $ PATH
.Добавьте эти строки в свой ~ / .profile
:
pathmunge ()
{
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)"; then
if [ "$2" = "after" ]; then
PATH=$PATH:$1;
else
PATH=$1:$PATH;
fi;
fi
}
Затем, чтобы добавить что-нибудь в начало вашего $ PATH
, добавьте эту строку в ~ / .profile
:
pathmunge "/path/to/foo"
И чтобы добавить его в конец:
pathmunge "/path/to/foo" after
Функция добавит новый каталог в $ PATH
, только если его там еще нет.
Вы применили ураган случайности в твои конфиги!
Если вы не можете отменить изменения в файлах в / etc
, возможно, вам придется переустановить bash
!
Вы можете настроить свой личный ПУТЬ
, не изменяя файлы в / etc
. Например, прочтите эти ответы . Я, конечно, предпочитаю свой ответ.
Вы можете точно определить, где вы сбились с пути, прочитав man bash
, man less
и одним глазком взглянув на раздел INVOCATION
в man bash
, используйте less
в файлах запуска. Когда кажется, что они передают управление ( источник
, .
), используйте команду less
!
, чтобы прочитать этот файл. Используйте команду /
less
для поиска строки PATH =
, чтобы найти назначения PATH
в каждом файле. Не забывайте быть таким же тупым, как bash
.
Вы можете сравнить (с diff
) файлы запуска ( .bashrc
, .profile
, .bash_login
) между вашими $ HOME
и "другого пользователя".