Добавить каталог в $ PATH в CentOS?


84

Мы только что запустили наш новый сервер (ы), и мы запускаем CentOS на них всех. После успешной установки Ruby Enterprise Edition я хотел бы добавить /usr/lib/ruby-enterprise/binкаталог REE / bin (расположенный в ), чтобы сделать его интерпретатором Ruby по умолчанию на сервере.

Я пробовал следующее, которое только добавляет его к текущей сессии оболочки:

export PATH=/usr/lib/ruby-enterprise/bin:$PATH

Каков будет правильный подход к постоянному добавлению этого каталога в $ PATH для всех пользователей . В настоящее время я вошел в систему как root.

Заранее спасибо!

Ответы:


116

Не рекомендуется редактировать /etc/profileподобные вещи, потому что вы потеряете все свои изменения, когда CentOS опубликует обновление для этого файла. Это именно то, что /etc/profile.dдля:

# echo 'pathmunge /usr/lib/ruby-enterprise/bin' > /etc/profile.d/ree.sh
# chmod +x /etc/profile.d/ree.sh

Войдите в систему и наслаждайтесь (безопасно) обновленным PATH:

# echo $PATH
/usr/lib/ruby-enterprise/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# which ruby
/usr/lib/ruby-enterprise/bin/ruby

Вместо повторного входа вы можете перезагрузить профиль:

# . /etc/profile

Это обновит $PATHпеременную.


1
~/.profileэто еще один действительный вариант
Zypher

4
Да, для одного пользователя. Но вопрос был об изменении PATH для всех пользователей.
Майк

2
@Mike Что это за команда pathmunge?
Николай Лещов

@NickolaiLeschov Я уверен, что он просто добавляет путь к $ PATH.
Майк

@NickolaiLeschov это функция, которая определена в / etc / profile
CrazyPheel

11

После следования совету fmonk я проверил /etc/bashrc, где заметил, что «Среда находится в / etc / profile». Я приступил к поиску /etc/profile, я увидел это:

pathmunge () {
    if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
       if [ "$2" = "after" ] ; then
          PATH=$PATH:$1
       else
          PATH=$1:$PATH
       fi
    fi
}

[...]

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
fi

Чтобы решить мою проблему, я просто добавил pathmunge /usr/lib/ruby-enterprise/binпод оператором if. Это решило мою проблему.


Может ли кто-нибудь объяснить, что "$EUID" = "0"значит в этом контексте?
Эли

EUID 0 означает, что пользователь является пользователем root.
bbaja42

6
Вы должны были использовать /etc/profile.d. Смотрите мой ответ ниже.
Майк

Пожалуйста, примите ответ @MikeConigliaro правильным. Его путь правильный. Это разработано, чтобы работать таким образом. Посмотрите на файлы в /etc/profile.d/папке, и вы заметите это. Также, по его словам, обновление системы может отменить ваше решение.
Кайо Кунья

4

"Интерактивная оболочка входа в систему запускается после успешного входа в систему, используя / bin / login, читая файл / etc / passwd. Этот вызов оболочки обычно читает / etc / profile и его частный эквивалент ~ / .bash_profile при запуске.

Интерактивная оболочка без входа в систему обычно запускается из командной строки с помощью программы оболочки (например, [prompt] $ / bin / bash) или команды / bin / su. Интерактивная оболочка без входа в систему также запускается с помощью терминальной программы, такой как xterm или konsole, из графической среды. Этот тип вызова оболочки обычно копирует родительскую среду и затем читает пользовательский файл ~ / .bashrc для получения дополнительных инструкций по настройке запуска. " Http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html

Поэтому я не буду помещать переменные среды в bashrc, потому что это не только противоречит общему соглашению, но вы также пропустите переменные bashrc при вызове терминала из графической среды рабочего стола.

На Redhat в /etc/profileя нашел этот комментарий:

«Общесистемные псевдонимы и функции должны быть в / etc / bashrc. Личные переменные среды и запускаемые программы должны быть в ~ / .bash_profile. Персональные псевдонимы и функции должны быть в ~ / .bashrc.»

Поэтому, если вы хотите установить переменные окружения для пользователя, сделайте это в пользовательском файле .bash_profile.

Направляясь к .bash_profileя прочитал:

«Личные переменные среды и автозагрузка программ.

Личные псевдонимы и функции должны быть в ~ / .bashrc. Общесистемные переменные среды и запускаемые программы находятся в / etc / profile. Общесистемные псевдонимы и функции находятся в / etc / bashrc. "

Заключение
Если вы хотите, чтобы только root видел программы, например, в / sbinя добавил бы этот путь к .bash_profileфайлу root . Но если вы хотите , чтобы каждый пользователь видеть , что корень конкретных программ, установленных на вашем компьютере , я бы поставил /sbinв /etc/.profile. Теперь каждый пользователь может использовать завершение табуляции для поиска специфических корневых программ и повышения прав при необходимости.

Особый случай: SSH
Когда ssh запускается из командной строки, запускается интерактивная оболочка входа. Но в этом случае /etc/profileне читается. Когда я определял переменные окружения в .bash_profileфайле каждого пользователя, он работал с ssh.


2

Извините, неправильно истолковал вопрос, следующий вопрос для профиля пользователя USER оставив его в случае, если он кому-то помогает

изменить .bash_profile

nano ~/.bash_profile

затем где-нибудь в файле добавьте / измените ваши пути, разделенные:

 PATH=$PATH:$HOME/bin:/your/path
 export PATH

затем перезагрузите свой профиль

source ~/.bash_profile

или выйдите и войдите снова

если вы проверяете PATH, он должен включать ваши недавно добавленные пути

echo $PATH

1

Вы можете установить переменные окружения в файле .rc; для оболочек bash (я считаю наиболее распространенным и по умолчанию в CentOS) у каждого пользователя есть файл с именем .bashrc в его домашнем каталоге.

Добавьте команду PATH = / usr / lib / ruby-enterprise / bin: $ PATH в этот файл, чтобы установить ее для любого конкретного пользователя.

Чтобы установить его для всех пользователей (как вы упомянули), измените его в / etc / bashrc (файл по умолчанию .bashrc в домашнем каталоге каждого пользователя должен содержать этот файл, но вы должны перепроверить его).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.