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

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


person Jed Daniels    schedule 25.03.2010    source источник


Ответы (16)


Вы можете ввести длинную команду:

source ~/.bashrc

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

. ~/.bashrc
person George Hawkins    schedule 25.03.2010
comment
Кажется, мне постоянно приходится делать это каждый раз, когда я открываю терминал ... есть ли способ автоматизировать это? - person Alex; 07.04.2012
comment
Это не совсем то же самое, что вход и выход. Скажем, у вас есть следующая строка в .bashrc: export PATH=$PATH:foo, а затем вы измените ее на export PATH=$PATH:bar. Если вы войдете в систему и выйдете обратно, только bar будет в PATH, но если вы сделаете то, что вы предлагаете, и foo, и bar будут в PATH. Вы знаете способ обойти это? - person HighCommander4; 25.04.2013
comment
что это за команда? Я выполнил команду man, но информации об этом нет. Поиск также не дает информации yandex.com/yandsearch?text=linux+man + источник & lr = 87. Это вообще команда? - person Tebe; 06.09.2013
comment
@gekannt - если вы наберете source, вы увидите, что источник не является обычной командой, а скорее встроенной оболочкой - это означает, что вы не найдете исполняемый файл для нее где-нибудь в файловой системе, например в / usr / bin, вместо этого он реализован как часть оболочки. Итак, если вы выполните команду man bash и выполните поиск раздела SHELL BUILTIN COMMANDS, а затем выполните поиск источника, вы найдете хорошее объяснение того, что делает источник (и если вы также понимаете fork, тогда должно стать ясно, почему источник является встроенным, а не встроенным. команда). - person George Hawkins; 09.09.2013
comment
@ HighCommander4 - очень неудовлетворительный способ сделать то, что вы хотите, - это выполнить bash -l, однако на самом деле это создает новую подоболочку, и когда вы выйдете из системы, вы вернетесь во включающую оболочку, где foo все еще находится в PATH. Если вас просто интересует PATH, вы можете отключить PATH и восстановить его с нуля, но, вероятно, проще / безопаснее сделать PATH = / bin: / usr / bin перед поиском вашего .bashrc. То, как переменная PATH создается при входе в систему, на самом деле довольно сложно, включая ввод, по крайней мере, из входа в систему (см. Вход в систему) и / etc / profile (см. Man bash). - person George Hawkins; 09.09.2013
comment
@Alex, вы можете автоматизировать это, добавив строку ~ / .bashrc в ~ / .bash_profile, хотя я не знаю, является ли это хорошей практикой. - person Vivek Gani; 24.10.2013
comment
Я также рекомендовал бы создать псевдоним (который можно сохранить в ~ / .bashrc или ~ / .bash_aliases), который открывает .bashrc и перезагружает его после выхода из редактора. Вы можете сделать это, объединив две команды в псевдониме, например так (если vim является вашим предпочтительным редактором, в противном случае замените его на что-то другое): alias editbashrc='vim ~/.bashrc; source ~/.bashrc'. Это сделает редактирование более плавным, так как вам не нужно думать о перезагрузке после редактирования, если вы используете настраиваемый псевдоним. - person Samuel Lampa; 12.11.2014
comment
Это повлияет только на текущий терминал. - person matepal297; 17.03.2015
comment
Я использую этот псевдоним для редактирования bashrc для всех пользователей: alias bashrc = sudo nano /etc/bash.bashrc; источник /etc/bash.bashrc - person Tarik; 20.08.2017
comment
Я думаю, что приведенный ниже ответ от @WhoSayIn должен быть предпочтительнее этого, чтобы предотвратить проблему PATH, описанную выше: exec bash - person zenw0lf; 24.12.2017
comment
Кажется, source ~/.bashrc это выброс из текущего python virtualenv. - person mrgloom; 01.07.2019
comment
Это будет действительно только для текущего терминала, независимо от того, используется ли запуск exec bash с нуля или специальный источник ~ / .bashrc. В настоящее время я работаю из дома, я хочу иметь возможность подключаться к моему удаленному хосту по SSH и иметь все обновленные настройки без выполнения этих команд каждый раз, когда я устанавливаю новое SSH-соединение. Я не могу войти в офис, чтобы выполнить выход / перезапуск на месте по практическим и бюрократическим причинам. Какие-либо предложения? - person MahNas92; 06.07.2020

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

exec bash

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

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

person WhoSayIn    schedule 06.03.2012
comment
Не могли бы вы объяснить разницу между командой source .bashrc и exec bash? - person muradin; 20.11.2014
comment
@muradin, source - это встроенная команда оболочки, которая выполняет содержимое файла, переданного в качестве аргумента, в текущей оболочке. Итак, в вашем примере он выполняет файл .bashrc в текущей оболочке. И команда exec заменяет оболочку заданной программой, в вашем примере она заменяет вашу оболочку на bash (с обновленными файлами конфигурации) - person WhoSayIn; 24.11.2014
comment
Это здорово, особенно потому, что bashrc может быть обновлен как в /etc, так и в /home каталоге, и нам не нужно об этом заботиться. - person Han; 31.03.2015
comment
В моих гиперспецифических обстоятельствах это полностью потрясло. Мой Dockerfile выполняет сценарий установки, который изменяет .bashrc. Затем мне нужно это перезагрузить, но . ~/.bashrc будет выполняться в dash, а не в bash, поэтому возникает ошибка из-за отсутствия shopt. source не найден в оболочке, так что и этого решения нет. Я попробовал это, и образ докера построился без проблем! - person m59; 02.06.2015
comment
Для CentOS7 и вспомогательных конфигураций bash это было наиболее полезно. Выполнение . ~/.bashrc не привело к перезагрузке моего файла пользовательских псевдонимов. - person onebree; 07.10.2015
comment
Элегантно, но делает то же самое не совсем правильно. source ~/.bashrc сохранит вашу всю среду оболочки (хотя, вероятно, будет изменена источником ~/.bashrc), тогда как exec bash сохранит только переменные среды вашей текущей оболочки (любые специальные изменения в текущая оболочка с точки зрения переменных оболочки, функции, параметры теряются). В зависимости от ваших потребностей может быть предпочтительнее тот или иной подход. - person mklement0; 29.01.2016
comment
@ mklement0, спасибо за подробную информацию. Это решение будет работать во многих случаях, но я думаю, вам может потребоваться использовать -source- в ситуациях, как вы упомянули. - person WhoSayIn; 01.02.2016
comment
@SEoF, когда вы говорите bash inception и если вы думаете о том, о чем я думаю, я должен сказать, что вы ошибаетесь. В отличие от фильма, вы не продолжаете переходить в bash из bash, когда повторяете exec bash. Команда exec заменяет оболочку программой, в нашем случае bash. Итак, в терминале всегда существует один экземпляр bash. - person John Red; 20.05.2016
comment
Некоторые конкретные примеры такого рода неожиданностей @ mklement0 упомянуты: ваш стек каталогов pushd / popd будет удален (за исключением CWD), и ваше PS1 приглашение будет сброшено. Некоторые среды разработки, такие как virtualenv / venv Python, изменяют ваши PATH и другие переменные и помещают имя активной среды в ваше PS1 приглашение. После exec bash переменные среды по-прежнему активны, но визуальный индикатор в приглашении PS1 гаснет. Кроме того, исчезли такие функции очистки, как deactivate. - person Kevin J. Chase; 26.09.2016
comment
Это работает для моего Cygwin + win7. Спасибо! Печатать это быстрее, чем печатать. ~ / .bashrc - person Danniel Little; 15.03.2017
comment
Будет ли это работать для другого сеанса, который я открою после запуска exec bash в моем текущем сеансе? - person nitinr708; 01.08.2017
comment
просто для добавления используйте: exec $ SHELL -l; поскольку $ SHELL в этом случае возвращает bash. - person Jimmy MG Lim; 02.06.2019
comment
Это сработало. Супер красиво, коротко, солидно. source по какой-то причине не работал. - person lowtechsun; 28.08.2019
comment
Это отлично сработало для меня, когда опция источника не работала, это именно то, что я искал! Спасибо, так что мне не нужно перезапускать терминал и использовать bash всякий раз, когда это абсолютно необходимо! Спасибо еще раз - person Iakovos Belonias; 02.03.2020
comment
@whosayin thx! это только помогло мне с выполнением ansible-playbooks, которые больше не принимали аргументы, которые работали ранее. - person ficestat; 26.08.2020

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

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

  • . ~/.bashrc или source ~/.bashrc сохранит ваш текущий сеанс оболочки:

    • Except for the modifications that reloading ~/.bashrc into the current shell (sourcing) makes, the current shell process and its state are preserved, which includes environment variables, shell variables, shell options, shell functions, and command history.
  • exec bash, или, что более надежно, exec "$BASH" [1], заменит вашу текущую оболочку новым экземпляром, и поэтому сохраняются только переменные среды текущей оболочки (включая те, которые вы определили специально, во время сеанса).

    • In other words: Any ad-hoc changes to the current shell in terms of shell variables, shell functions, shell options, command history are lost.

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


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

person mklement0    schedule 28.01.2016
comment
Вы ответили на мой вопрос, прежде чем я успел его задать. Это полезно знать; Я часто настраиваю CLASSPATH на один сеанс. - person swinefish; 07.04.2016
comment
Итак, даже если я вызову exec $ BASH, будут ли переменные, которые устанавливает .bashrc, будут найдены в оболочке, которую я открою следующей (используя тот же исполняемый файл, что и мой текущий сеанс)? - person nitinr708; 01.08.2017
comment
@ nitinr708: Да, exec $BASH будет источником ~/.bashrc, поэтому вы увидите его изменения в среде оболочки в новом сеансе. - person mklement0; 01.08.2017

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

. .bashrc
person Randy Proctor    schedule 25.03.2010
comment
Это будет работать только в том случае, если ваш текущий каталог на самом деле является вашим домашним каталогом. Следующее будет работать:. ~ / .bashrc - person Brian Showalter; 25.03.2010
comment
Что заставляет это работать? Что на самом деле происходит, когда я это делаю. .bashrc? Спасибо! - person Jed Daniels; 25.03.2010
comment
. - это ярлык BASH для встроенной команды source. Так . .bashrc - это то же самое, что исходный .bashrc для интерпретатора BASH. - person Brian Showalter; 25.03.2010
comment
Прохладный. Спасибо. Теперь, когда я не знал. - person Jed Daniels; 25.03.2010
comment
Я только что отправил запрос на редактирование, чтобы добавить ~/, но поскольку в верхнем ответе показаны как source ~/.bashrc, так и . ~/.bashrc, мне интересно, следует ли просто удалить этот ответ как избыточный. - person Max Ghenis; 01.12.2016
comment
@RandyProctor: Хотя вы отметили, что ваш ответ хуже принятого, было бы похвально, но было бы даже лучше, если бы вы просто удалили его, учитывая, что он не только явно хуже (из-за того, что если текущий каталог оказывается домашним каталогом текущего пользователя, как указано), но, наоборот, не добавляет ничего интересного. - person mklement0; 25.03.2019

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

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

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

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

person Roy Lin    schedule 29.02.2016

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

bash

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

person James    schedule 08.03.2012
comment
Однако это вызовет новую оболочку внутри текущей, что приведет к потере ресурсов. Лучше используйте решение @ WhoSayln exec, которое заменяет текущую оболочку вновь вызванной. - person Bernhard Wagner; 04.09.2013
comment
да, просто используйте исходный код. Это совершенно не нужно и раздражает. - person dylnmc; 24.09.2014
comment
В дополнение к комментарию @ BernhardWagner вы также потеряете текущую историю bash, если создадите новую оболочку - person peterchaula; 06.05.2017
comment
Это хорошее решение, при котором доступ пользователей ограничен. - person Tunde Pizzle; 18.10.2018
comment
вызов подпроцесса добавляет уровень сложности, не имеющий дополнительной ценности. - person Alan Berezin; 02.01.2020

. ~/.bashrc

. - это встроенная функция POSIX


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

source ~/.bashrc

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

exec bash
  • exec команда заменяет оболочку заданной программой ... - WhoSayIn
person Geoffrey Hale    schedule 14.02.2017
comment
exec bash по-прежнему наследует среду текущей оболочки. exec env -i bash будет ближе (или exec env -i bash -l, если вы в настоящее время находитесь в оболочке входа в систему). - person chepner; 16.05.2017

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

exec $SHELL -l;

person Jimmy MG Lim    schedule 01.06.2019

В зависимости от вашей среды вы можете добавить скрипт для автоматической загрузки .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.

person karolus    schedule 04.10.2018
comment
У меня есть это в .profile, но он не работает - каждый раз, когда я выхожу, мне приходится делать это вручную. Какие-либо предложения? - person Wayne Smallman; 04.07.2019

тип:

source ~/.bashrc

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

. ~/.bashrc

person jwismar    schedule 25.03.2010
comment
Опять же, работает только в том случае, если вы находитесь в домашнем каталоге, или, точнее, в каталоге, в котором находится .bashrc. Как сказано в принятом ответе, более правильный способ сделать это - source ~/.bashrc. - person John Red; 20.05.2016

Для меня то, что работает, когда я изменяю PATH, это: exec "$BASH" --login

person Cecília Assis    schedule 08.08.2018
comment
Речь идет о перезагрузке ~/.bashrc, которая --login не (напрямую) перезагружается; на уровне пользователя вместо этого перезагрузится ~/.bash_profile (или ~/.bash_login, или ~/.profile). - person mklement0; 25.03.2019

Я использовал 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 - это фактически новое имя пользователя, которое вы создали выше, а теперь войдите с помощью)

person SherylHohman    schedule 10.11.2018

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

. ~/.bashrc

более короткая версия

source ~/.bashrc
person Sojan Jose    schedule 02.10.2014
comment
@jwg принятый ответ. .bashrc. будет работать, только если вы находитесь в домашнем каталоге msysgit. - person Sojan Jose; 09.10.2014
comment
@jwg ok, я думаю, я упоминал, что вам не нужно набирать 'source ~ / .bashrc', вместо этого используйте более короткую версию. - person Sojan Jose; 09.10.2014
comment
@jwg хорошо, я добавил его как правку к исходному ответу :) - person Sojan Jose; 09.10.2014
comment
Почему избыточный ответ @Sojan? - person nitinr708; 02.08.2017
comment
@ nitinr708 2014. почти не помню: П. исходный ответ был отредактирован позже, я думаю. - person Sojan Jose; 06.08.2017

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

history -a && exec bash -l
person beattidp    schedule 14.11.2018

Это тоже сработает ..

cd ~
source .bashrc
person kirti    schedule 04.03.2014
comment
Да, но он также меняет рабочий каталог на ~, что нежелательно. - person Albin; 03.06.2014
comment
Спасибо за поддержание контекста @Krinkle - person nitinr708; 03.08.2017
comment
Обязательно ли указывать ~, чтобы сменить рабочий каталог на домашний каталог пользователя? - person Kenly; 16.08.2018

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

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

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

Я считаю, что это лучший способ выполнять свою работу.

person CatDog    schedule 22.05.2018