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

294
Lone Learner

У меня есть 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чтобы оно было доступно пользователю, когда пользователь запускает терминал?

0
[Эта статья] (https://blog.flowblok.id.au/2013-02/shell-startup-scripts.html) прекрасно объясняет, какой сценарий запуска запускается когда. Benjamin W. 6 лет назад 0
Что вы подразумеваете под * "ПУТЬ, обновленная в ~ / .profile" *? 6 лет назад 0
@EmilyE. Смотрите первый блок кода в моем вопросе. Он обновляет существующий (унаследованный) `PATH`, добавляя` $ HOME / bin` в начало `PATH`. Lone Learner 6 лет назад 0
В основном .profile (предполагается, что) будет получен один раз за сеанс * login *. Если вы войдете в систему с терминала, вы увидите свое эхо. В сеансе X это моделируется - что-то еще приведет к тому, что этот файл будет эмулировать устаревшее поведение (один раз для вашего сеанса). Когда вы запускаете терминал из XFCE, вы больше не входите в систему, а просто разветвляетесь. Также для лучшего "доказательства", почему бы вам не сделать ~ "echo .profile execute \` date \ `>> / tmp / profile-hit". spinkus 6 лет назад 0
@spinkus Я добавил эту строку в мой `~ / .profile`, перезагрузил систему, вошел в XFCE и запустил терминал. Но `/ tmp / profile-hit` не был создан, подтверждая мое утверждение о том, что` ~ / .profile` не был выполнен ни на одном этапе. Я знаю, что если я войду в реальный терминал (`tty1`,` tty2` и т. Д.), `~ / .Profile` будет выполнен. Тем не менее, мне интересно узнать, почему `PATH` переопределяется в` ~ / .profile`, когда это переопределение не повлияет на какой-либо сеанс терминала в среде рабочего стола XFCE. Lone Learner 6 лет назад 0
Вопросы об общем вычислительном оборудовании и программном обеспечении не относятся к теме переполнения стека, если они не связаны непосредственно с инструментами, используемыми в основном для программирования. Вы можете получить помощь по [SU]. ΔRob 6 лет назад 1

4 ответа на вопрос

0

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

Ваш ответ неверный. `~ / .profile` выполняется в интерактивной оболочке входа в систему, а также в неинтерактивной оболочке с параметром --login. Это не имеет никакого отношения к тому, запущена ли оболочка в tty или GUI. Даже в графическом интерфейсе вы можете запустить интерактивную оболочку входа в систему с помощью команды `su -`, и` ~ / .profile` будет выполнен. Смотрите man bash для более подробной информации. Сказав это, каков ваш ответ на заданный вопрос: почему `PATH` определен в` ~ / .profile`, если он не будет доступен в интерактивной оболочке без входа в систему? Lone Learner 6 лет назад 3
Спасибо, что поправили меня. Я только что прошел [это] (https://askubuntu.com/a/279374). Возникает аналогичный вопрос. У меня лично нет ответа на это. 6 лет назад 0
0
Yokai

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 обрабатывает конфигурации оболочки со ссылками, которые могут помочь.

В последних файлах Debian по умолчанию `.profile` проверяет, работает ли на нем Bash, и, если да, загружает` .bashrc`. С точки зрения разработки Debian, это относительно недавнее соглашение, и, конечно, оно не распространяется на другие дистрибутивы. tripleee 6 лет назад 0
@Yokai Так почему же Debian определяет собственный `PATH` в` ~ / .profile`, даже если по умолчанию он не будет выполняться при запуске Bash в XFCE Terminal? Lone Learner 6 лет назад 0
0
Bach Lien

От 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или GUI, или несколько иначе.

Senario 1: Некоторым пользователям может потребоваться не-X в качестве рабочей среды по умолчанию; и 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:zsh пользователь может установить PATHв ~/.zprofile. Интерактивные настройки для bashнаходятся в местах ~/.bashrc, и интерактивные настройки для zshнаходятся в ~/.zshrc.

0
Ljm Dullaart

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

Извините, я в замешательстве. На какую часть моего вопроса вы отвечаете? Lone Learner 6 лет назад 0
Если ~ / .profile не выполняется при запуске нового Терминала, почему PATH обновляется в ~ / .profile? Ljm Dullaart 6 лет назад 0