bashrc или bash_profile?

49

Я знаю разницу между двумя сценариями входа в bash:

.bashrc запускается только оболочками, не входящими в систему.

.bash_profile(или .bash_loginили .profile) выполняется "логином" оболочек.

Есть ли у кого-нибудь хорошие примеры того, какие вещи лучше подходят для выполнения только при входе в систему, например, я бы их только добавил .bash_profile, но они не имели бы смысла .bashrc?

(Я знаю, что большинство из нас исходят .bashrcиз этого .bash_profile, так что, похоже, нет особого смысла в противоположном вопросе ...)

Дон фолкнер
источник
3
Смотрите также тот же вопрос в Super User .
Жиль "ТАК - перестать быть злым"

Ответы:

24

Так как a .bashrcдля оболочек без входа в систему, я избегаю любых команд, которые отражаются на экране. Я также сталкивался с опытом, когда операторы echo .bashrcприводят к сбою команд sftp и rsync (и, возможно, к командам scp).

# Print some information as we log in
# -s: OS Name -n: Node name -r: OS Release
uname -snr
uptime

Кроме того, вы обычно не запускаете ssh-agent из неинтерактивной оболочки. Так что у меня есть это .bash_profile.

if [ -f ~/.ssh/ssh-agent ]; then . ~/.ssh/ssh-agent; fi
Стефан Ласевский
источник
2
Если вы используете ~ / .profile вместо ~ / .bash_profile, то все равно будет работать, даже если вы измените оболочки. ~ / .Bash_profile предназначен для конкретных вещей bash.
LassePoulsen
1
Но bash будет запускать только EITHER .bash_profile ИЛИ .profile, поэтому, если вы собираетесь использовать оба, вам нужно получить .profile из .bash_profile или что-то в этом роде. Это неплохая идея, на самом деле ...
Дон Фолкнер,
@ Источник & @ Дон: Хорошие моменты. Раньше в моем .bash_profile были Bashisms, но теперь я переключился на что-то более универсальное. Возможно использование .profile в порядке.
Стефан Ласевски
Что касается выдачи команд при .bashrcвмешательстве в методы удаленной передачи файлов, реализованные через стандартные потоки , решение состоит в том, чтобы поместить такие команды в код, который проверяет, является ли оболочка интерактивной и продолжается ли она только в том случае, если она есть. Пользовательские .bashrcфайлы по умолчанию в Ubuntu, скопированные /etc/skel/.bashrcпри создании учетной записи, а также в масштабе всей системы /etc/bash.bashrc, уже содержат код, который проверяет и возвращает, не является ли оболочка неинтерактивной (хотя все равно необходимо помещать под них свои производящие вывод команды ).
Элия ​​Каган
8

Бёбу - отличный пример того, что вы никогда не должны использовать .bashrc.

В противном случае, он будет рекурсивно работать сам в каждом из своих «виртуальных терминалов» ;-)

Вы можете попробовать это хотя, это отчасти весело.

Вот почему вы вставляете его .profile, поэтому byobu (который на самом деле просто оболочка вокруг экрана) загружается только один раз, во время входа в систему. И сама Бёбу может начать новые интерактивные сессии Bash.

Ralf
источник
Это хороший пример. Спасибо за указатель на Бёбу. А теперь попробуй.
Дон Фолкнер