Почему PATH определяется в ~/.profile, даже если запуск терминала с помощью bash выполняется только ~/.bashrc?

У меня есть guest учетная запись пользователя в моей системе Debian с рабочим столом XFCE.

Оно имеет ~/.profile файл добавлен по умолчанию. Последние несколько строк этого файла:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

echo .profile executed

Последний echo Команда добавлена ​​мной. Я гарантировал, что $HOME/bin существует.

guest@debian:~$ ls -ld $HOME/bin
drwxr-xr-x 2 guest guest 4096 Jan  9 09:42 /home/guest/bin

После загрузки системы Debian я захожу на рабочий стол XFCE, используяguest Учетная запись и запуск терминала (xfce4-терминал). Но я не вижу никаких доказательств того, что ~/.profile был выполнен.

guest@debian:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

man bash проясняет, что ~/.profile читается и выполняется в интерактивной оболочке входа в систему или неинтерактивной оболочке с --login вариант. ~/.bashrc выполняется в интерактивной оболочке без входа в систему, так что, похоже, когда xfce4-терминал запускает bash, ~/.profile не выполняется.

Если ~/.profile не запускается при запуске нового Терминала, почему PATH обновлено в ~/.profile?

Должен ли Debian предоставлять PATH обновить в ~/.bashrc чтобы он был доступен пользователю, когда пользователь запускает терминал?

4 ответа

От man bash:

Когда bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с параметром -login, она сначала читает и выполняет команды из файла / etc / profile, если этот файл существует. После прочтения этого файла он ищет ~ /.bash_profile, ~ /.bash_login и ~/.profile в указанном порядке, а также читает и выполняет команды из первой существующей и доступной для чтения....

Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему, bash читает и выполняет команды из ~ /.bashrc, если этот файл существует....

Я это понимаю

  1. ~/.bashrc: для интерактивной оболочки
  2. ~/.bash_profile, ~/.bash_login, ~/.profile: для входа в оболочку

Итак, если вам нужно изменить PATH в терминале, который представляет собой интерактивную оболочку, то вы можете поместить это PATH настройки в ~/.bashrc; или, альтернативно, вы можете источник ~/.profile от ~/.bashrc всякий раз, когда вы находитесь в оболочке без входа в систему, например:

shopt -q login_shell || . ~/.profile

Почему PATH установлен в ~/.profile как рекомендуемый способ, я считаю, что пользователь определил PATH должен быть установлен правильно, когда он / она входит в систему, и "логин" может быть bash, zsh или графический интерфейс, или несколько другое.

Senario 1: Некоторым пользователям может потребоваться не-X в качестве рабочей среды по умолчанию; и Х вызывается бегом startx обычно или автоматически из ~/.profile когда логин виртуального терминала tty7,

[ -z $DISPLAY -a $XDG_VTNR -eq 7 ] && exec startx

В этом случае пользователи тщательно выбирают, что устанавливать в ~/.profile, ~/.bashrc, а также ~/.xinitrc, чтобы они имели желаемый набор переменных окружения --- PATH, EDITOR, VISUAL, BROWSER и т. д.- работает ли он в:

  1. Консоли (Ctrl+Alt+F[1-6]) или вход без X через ssh: ~/.profile + ~/.bashrc
  2. Нетерминальные программы в X: ~/.profile + ~/.xinitrc
  3. Эмуляторы терминала в X: ~/.profile + ~/.xinitrc + ~/.bashrc

Итак, настройка PATH в ~/.profile это лучший выбор. Пользователи могут установить EDITOR как vim в ~/.profile (в не-X), но измените его на emacs в ~/.xinitrc (в X).

Senario 2: пользователь графического интерфейса, который входит в XFCE вместо этого войдите как bash; так PATH может быть установлен в ~/.xsessionrc как объяснено здесь.

Senario 3: A zsh пользователь может установить PATH в ~/.zprofile, Интерактивные настройки для bash места в ~/.bashrc и интерактивные настройки для zsh помещены в ~/.zshrc,

~/.profile выполняется при входе в систему в режиме консоли, а не в графическом режиме. Вы можете использовать ключи F1, F2 ... войти, используя консольный режим.

Я всегда понимал, что .bashrc специфичен для bash и .profile это поперечная оболочка. Это не может быть проблемой для большинства домашних пользователей, но я иногда нахожусь в системе, где пользователи предпочитают ksh (и применять этот выбор для новых пользователей). Если по какой-то причине вы получите борщевик, .profile также используется. Обратите внимание, что zsh и csh не используют.profile.

Edit -> Profile Preferences -> Title and Command -> "Run command as a login shell"

Обычный ~/.profile грузы ~/.bashrc если это доступно, если - при условии $BASH_VERSION присутствует в вашей среде.

Имейте в виду, что хотя ~/.profile игнорируется, если есть ~/.bash_profile или же ~/.bash_login в вашем доме и что, в результате этого игнорируется, ~/.bashrc тоже не поставляется.

Этот ответ был получен здесь при исследовании аналогичной проблемы. И в этом ответе Unix & Linux упоминается, как Debian обрабатывает конфигурации оболочки со ссылками, которые могут помочь.

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