Как перезагрузить .bashrc без выхода и повторного входа?

1645

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

Джед Дэниелс
источник

Ответы:

2638

Вам просто нужно ввести команду:

source ~/.bashrc

или вы можете использовать более короткую версию команды:

. ~/.bashrc
Джордж Хокинс
источник
88
Это не совсем то же самое, что вход в систему и выход из нее. Скажем, у вас есть следующая строка в .bashrc:, export PATH=$PATH:fooа затем вы измените ее на export PATH=$PATH:bar. Если войти в систему и обратно, только barбудет в PATH, но если вы делать то , что вы предлагаете, как fooи barбудет в PATH. Вы знаете способ обойти это?
HighCommander4
7
@ HighCommander4 - очень неудовлетворительный способ сделать то, что вы хотите, это выполнить "bash -l", однако это фактически создает новый подоболочек, и когда вы выходите из системы, вы возвращаетесь в оболочку, в которой "foo" все еще находится в PATH. Если вы просто заинтересованы в PATH, вы можете сделать «unset PATH» и восстановить его с нуля, но, вероятно, проще / безопаснее сделать «PATH = / bin: / usr / bin» перед поиском вашего .bashrc. То, как переменная PATH создается при входе в систему, на самом деле достаточно сложное, включая как минимум ввод данных из входа в систему (см. «Man login») и / etc / profile (см. «Man bash»).
Джордж Хокинс
2
@ Алекс, вы можете автоматизировать это, добавив строку ~ / .bashrc в ~ / .bash_profile, хотя я не знаю, является ли это хорошей практикой.
Вивек Гани
4
Я также рекомендовал бы создать псевдоним (который вы можете сохранить в ~ / .bashrc или ~ / .bash_aliases), который открывает .bashrc и перезагружает его после выхода из редактора. Вы можете сделать это путем объединения двух команд в качестве псевдонима, например , как так (если ВИМ ваш предпочтительный редактор, в противном случае поменять его на что - то еще): alias editbashrc='vim ~/.bashrc; source ~/.bashrc'. Это сделает редактирование намного более плавным, поскольку вам не нужно думать о перезагрузке после выполнения редактирования, если вы используете собственный псевдоним.
Самуэль Лампа
6
Это повлияет только на текущий терминал.
matepal297
284

Или вы можете использовать:

exec bash

Это делает то же самое, и его легче запомнить (по крайней мере, для меня).

Команда execполностью заменяет процесс оболочки, выполняя указанную командную строку. В нашем примере он заменяет текущую оболочку новым экземпляром bash(с обновленными файлами конфигурации).

WhoSayIn
источник
13
Не могли бы вы объяснить разницу source .bashrcкомандования и exec bash?
Мурадин
18
@muradin, sourceэто встроенная команда оболочки, которая выполняет содержимое файла, переданного в качестве аргумента, в текущей оболочке . Итак, в вашем примере он выполняет файл .bashrc в текущей оболочке. И execкоманда заменяет оболочку на заданную программу, в вашем примере она заменяет вашу оболочку на bash (с обновленными файлами конфигурации)
WhoSayIn
3
В моих гиперспецифических обстоятельствах это полностью потрясло. Мой Dockerfile выполняет скрипт установки, который модифицирует .bashrc. Затем мне нужно, чтобы перезагрузить, но . ~/.bashrcбудет выполняться, dashа не bash, так что есть ошибка, потому что shoptотсутствует. sourceне найден в оболочке, так что решение также отсутствует. Я попробовал это, и образ докера выстроился плавно!
m59
9
Элегантно, но «делает то же самое» не совсем правильно. source ~/.bashrcбудет сохранять всю среду оболочки (хотя , вероятно , модифицированную отслеживанию источников ~/.bashrc), в то время как exec bashтолько сохранить вашу текущую оболочку в переменных окружении (любой одноранговые изменения в текущую оболочку в терминах переменной оболочки, функция, параметры теряются). В зависимости от ваших потребностей, один или другой подход может быть предпочтительным.
mklement0
12
@ SEOF, когда вы говорите «начало bash» и если вы думаете, что я думаю, вы думаете, я должен сказать, что вы не правы. В отличие от фильма, вы не продолжаете заходить в bash из bash, когда вы это делаете неоднократно exec bash. execКоманда заменяет оболочку с программой, в нашем случае, Баш. Таким образом, в терминале всегда существует один экземпляр bash.
Джон Ред
121

Чтобы дополнить и сопоставить два самых популярных ответа, . ~/.bashrcа также exec bash:

Оба решения эффективно перезагружаются ~/.bashrc, но есть различия:

  • . ~/.bashrcили source ~/.bashrcбудет сохранить текущую оболочку :

    • Для модификаций , которые перегрузочное исключение ~/.bashrcв текущую оболочку ( поиск ) делает, ток оболочка и его состояние являются сохранились , которая включает в себя переменные средах, оболочки, переменных оболочки, оболочка варианты функций и истории команд.
  • exec bashИли, более надежно, exec "$BASH"[1] , будет заменить текущую оболочку с новым экземпляром, и поэтому только сохранить вашу текущую оболочку в переменных средах ( в то числе тех , которые вы определили одноранговые).

    • Другими словами: любые временные изменения в текущей оболочке с точки зрения переменных оболочки, функций оболочки, параметров оболочки, истории команд теряются.

В зависимости от ваших потребностей, один или другой подход может быть предпочтительным.


[1] exec bashтеоретически может выполнить исполняемый файл, отличный bash от того, который запустил текущую оболочку, если он существует в каталоге, указанном ранее в $PATH. Поскольку специальная переменная $BASHвсегда содержит полный путь к исполняемому файлу, который запустил текущую оболочку, exec "$BASH"гарантированно будет использоваться один и тот же исполняемый файл.
Примечание повторно "..."вокруг $BASH: двойные кавычки гарантирует , что значение переменной используется как есть, без интерпретации Bash; если значение не имеет встроенных пробелов или других метасимволов оболочки (что маловероятно в этом случае), вам не нужны двойные кавычки, но их использование - хорошая привычка для формирования.

mklement0
источник
Вы ответили на мой вопрос, прежде чем я смог его задать. Это хорошо знать; Я часто устанавливаю свой CLASSPATH для одного сеанса.
свиная рыба
Таким образом, даже если я вызову exec "$ BASH", найдутся ли переменные, которые устанавливает .bashrc, в оболочке, которую я открою следующей (используя тот же исполняемый файл, что и мой текущий сеанс)?
nitinr708
3
@ nitinr708: Да, exec $BASHбудет источником ~/.bashrc, так что вы увидите его изменения в среде оболочки в новом сеансе.
mklement0
@ Gaming32, я ценю идею гиперссылки на сноску, но на самом деле она не сработала (и в таком коротком ответе, как этот, это не так уж важно).
mklement0
44

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

. .bashrc
Рэнди Проктор
источник
25
Это будет работать только в том случае, если ваш текущий каталог фактически является вашим домашним каталогом. Следующее будет работать:. ~ / .bashrc
Брайан Шоуолтер
6
Что делает эту работу? Что на самом деле происходит, когда я делаю ".bashrc"? Спасибо!
Джед Дэниелс
54
, является ярлыком BASH для встроенной команды «source». Таким образом, «.bashrc» - это то же самое, что «source .bashrc» для интерпретатора BASH.
Брайан Шоуолтер
7
Круто. Спасибо. Теперь, когда я не знал.
Джед Дэниелс
2
Я только что отправил запрос на изменение, чтобы добавить ~/, но так как верхний ответ показывает оба, source ~/.bashrcи . ~/.bashrcмне интересно, должен ли этот ответ быть просто удален как избыточный.
Макс Генис
18

В зависимости от вашей среды, просто набрав

bash

также может работать.

Джеймс
источник
15
Однако это вызовет новую оболочку в текущей, тратя таким образом ресурсы. Лучше использовать exec- решение @ WhoSayln, которое заменяет текущую оболочку вновь вызванной.
Бернхард Вагнер
да, просто используйте источник. Это совершенно ненужно и раздражает.
dylnmc
В дополнение к комментарию @ BernhardWagner вы также потеряете свою текущую историю bash, если
создадите
Это хорошее решение, при котором доступ к привилегиям пользователя ограничен.
Tunde Pizzle
вызов подпроцесса добавляет уровень сложности, который не имеет никакого дополнительного значения.
Алан Березин
18

При этом вам даже не нужно будет набирать «source ~ / .bashrc»:

Включите ваш файл bashrc:

alias rc="vim ~/.bashrc && source ~/.bashrc"

Каждый раз, когда вы хотите отредактировать ваш bashrc, просто запустите псевдоним " rc "

Рой Лин
источник
15
. ~/.bashrc

. является встроенным в POSIX


альтернативы

source ~/.bashrc

sourceявляется синонимом точка / точка .в bash, но не в POSIX sh, поэтому для максимальной совместимости используйте точку.

exec bash
  • execкоманда заменяет оболочку с заданной программой ... - WhoSayIn
Джеффри Хейл
источник
2
exec bashпо-прежнему наследует окружение текущей оболочки. exec env -i bashбудет ближе (или exec env -i bash -lесли вы в настоящее время в оболочке входа в систему).
chepner
5

В зависимости от вашей среды вы можете захотеть добавить сценарии для автоматической загрузки .bashrc при открытии сеанса SSH. Недавно я выполнил миграцию на сервер под управлением Ubuntu, и там по умолчанию загружается .profile, а не .bashrc или .bash_profile. Для запуска любых сценариев в .bashrc мне приходилось запускать source ~/.bashrcкаждый раз, когда открывался сеанс, что не помогает при запуске удаленного развертывания.

Чтобы ваш .bashrc загружался автоматически при открытии сессии, попробуйте добавить это в .profile:

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Снова откройте сеанс, и он должен загрузить все пути / сценарии, которые у вас есть в .bashrc.

Karolus
источник
У меня есть это в «.profile», но оно не работает - каждый раз, когда я выхожу, я должен делать это вручную. Какие-либо предложения?
Уэйн
4

Я использовал easyengine, чтобы настроить свой облачный сервер vultr.
Я нашел мой файл Bash в /etc/bash.bashrc.

Так source /etc/bash.bashrcсделал трюк для меня!

Обновить

При настройке пустого сервера (Ubuntu 16.04) вы можете использовать приведенную выше информацию, когда вы еще не настроили имя пользователя и входите через root.

Лучше всего создать пользователя (с привилегиями sudo) и войти в систему под этим именем пользователя.
Это создаст каталог для ваших настроек, включая файлы .profile и .bashrc.
https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/

Теперь вы будете редактировать и (и «исходный») ~/.bashrcфайл.

На моем сервере это было в /home/your_username/.bashrc
(где your_usernameна самом деле новое имя пользователя, которое вы создали выше, и теперь войдите с помощью)

SherylHohman
источник
4

exec bash - отличный способ перезапустить и запустить новую оболочку, чтобы заменить текущую. Чтобы добавить к ответу, $ SHELL возвращает текущую оболочку bash. Используя следующее, он перезагрузит текущую оболочку, а не только bash.

exec $SHELL -l;

Джимми М.Г. Лим
источник
3

Для меня то, что работает, когда я меняю ПУТЬ, это: exec "$BASH" --login

Сесилия Ассис
источник
Речь идет о перезагрузке ~/.bashrc, которая не--login будет (непосредственно) перезагружаться; на уровне пользователя он будет перезагружен (или или ) вместо этого. ~/.bash_profile~/.bash_login~/.profile
mklement0
3

тип:

source ~/.bashrc

или, в более короткой форме:

. ~/.bashrc

jwismar
источник
1
Опять же, работает, только если вы находитесь в домашнем каталоге, или, точнее, в каталоге, где .bashrcнаходится. Как сказано в принятом ответе, более правильный способ сделать это source ~/.bashrc.
Джон Ред
2

я использую следующую команду на msysgit

. ~/.bashrc

укороченная версия

source ~/.bashrc
Sojan V Jose
источник
@jwg принятый ответ. .bashrc. будет работать, только если вы находитесь в домашнем каталоге на msysgit.
Соян V Хосе
@jwg Хорошо, я сказал, что вам не нужно печатать 'source ~ / .bashrc', вместо этого используйте более короткую версию.
Соян V Хосе
@jwg хорошо, я добавил это как редактирование к оригинальному ответу :)
Sojan V Jose
Почему избыточный ответ @ Соян?
nitinr708
@ nitinr708 2014. я едва помню: P. оригинальный ответ был отредактирован позже, что-то, я думаю.
Sojan V Jose
2

Предполагая интерактивную оболочку, вы хотите сохранить текущую историю команд, а также загрузить / etc / profile (который загружает данные среды, включая / etc / bashrc, а в Mac OS X загружает пути, определенные в /etc/paths.d/, через path_helper), добавьте историю команд и выполните команду bash с параметром входа в систему ('-l'):

history -a && exec bash -l
beattidp
источник
1

Это также будет работать ..

cd ~
source .bashrc
Kirti
источник
7
Это так, но он также меняет рабочий каталог на ~, что не нужно.
Альбин
1
Спасибо за поддержку контекста @Krinkle
nitinr708
Нужно ли указывать ~изменить рабочий каталог на домашний каталог пользователя?
Кенли
1

Я заметил, что чистая exec bashкоманда сохранит переменные среды, поэтому вам нужно использовать exec -c bashbash для запуска в пустой среде.

Например, вы входите в bash и export A=1, если вы exec bash, - A == 1.

Если вы exec -cl bash, Aпусто.

Я думаю, что это лучший способ сделать свою работу.

Котопес
источник
-2

у меня лично есть

alias ..='source ~/.bashrc'

в моем bashrc, так что я могу просто использовать "..", чтобы перезагрузить его.

Фло
источник
4
Многие используют ..псевдоним для cd .., так что это будет очень запутанно.
Крестный отец
кроме псевдонима хорошая идея. alias rehash='source ~/.bashrc'мой выбор
Фрэнк Нок
использовать что-то вроде "_rs", который я использую для перезагрузки оболочки. я в значительной степени использую _ для начала своих псевдонимов; который похож на js libs underscorejs или lodash.
Джимми М.Г. Лим