Where is my изменчивый PATH being set?

Изменчивый г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?

7
задан 4 December 2015 в 09:22

3 ответа

Чтобы найти все места, где изменяется переменная окружения $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.

2
ответ дан 23 November 2019 в 06:21

ПУТЬ можно задать в любом из различных файлов, которые 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 , только если его там еще нет.

7
ответ дан 23 November 2019 в 06:21

Вы применили ураган случайности в твои конфиги!

Если вы не можете отменить изменения в файлах в / etc , возможно, вам придется переустановить bash !

Вы можете настроить свой личный ПУТЬ , не изменяя файлы в / etc . Например, прочтите эти ответы . Я, конечно, предпочитаю свой ответ.

Вы можете точно определить, где вы сбились с пути, прочитав man bash , man less и одним глазком взглянув на раздел INVOCATION в man bash , используйте less в файлах запуска. Когда кажется, что они передают управление ( источник , . ), используйте команду less ! , чтобы прочитать этот файл. Используйте команду / less для поиска строки PATH = , чтобы найти назначения PATH в каждом файле. Не забывайте быть таким же тупым, как bash .

Вы можете сравнить (с diff ) файлы запуска ( .bashrc , .profile , .bash_login ) между вашими $ HOME и "другого пользователя".

4
ответ дан 23 November 2019 в 06:21

Другие вопросы по тегам:

Похожие вопросы: