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

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

21 ответ

Решение

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

source ~/.bashrc

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

. ~/.bashrc

Или вы могли бы использовать;

exec bash

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

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

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

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

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

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

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

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


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

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

. .bashrc

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

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

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

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

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

bash

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

. ~/.bashrc

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


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

source ~/.bashrc

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

exec bash
  • exec команда заменяет оболочку с заданной программой... - WhoSayIn

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

exec $SHELL -l;

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

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

Тип:

source .bashrc

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

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

history -a && exec bash -l

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

. ~/.bashrc

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

source ~/.bashrc

Я так понимаю, вы хотите оболочку, как после выхода из системы и снова. Я считаю, что лучший способ добиться этого:

      exec env -i HOME="$HOME" "$SHELL" -l

execзаменит текущую оболочку, так что вы не останетесь с ней, когда выйдет новая. envсоздаст новую пустую среду с -iмы добавляем $HOMEтак что ваша оболочка (обычно bash), заданная $SHELLмогу найти ~/.profile/ ~/.bash_profile(и, таким образом, (в ubuntu или если указано) ~/.bashrc). Они будут получены благодаря -l. Хотя я не совсем уверен.

Имейте в виду, что $SHELL может привести к неожиданным результатам,
например, при подключении к среде Docker.

      echo $SHELL
/usr/sbin/nologin

так что если вы попытаетесь, вы будете отключены

      exec $SHELL
This account is currently not available.

поэтому вам, возможно, придется использовать что-то более сложное, например

      exec $(pgrep -l sh | grep "^`echo $$` " | cut -d" " -f2)

предполагая, что каждая оболочка содержит «sh», и этот командный конвейер

      pgrep -l sh | grep "^`echo $$` " | cut -d" " -f2

производит полную команду,
если у вас есть аргументы или флаги, которые вам, возможно, придется использовать -f2,3,4 или попробовать

      pgrep -l sh | grep "^`echo $$` " | sed -E 's/^[0-9]+ //'

Но прочитайте все советы выше.
Лично я не люблю терять историю оболочки ... но это зависит от вас и ваших потребностей.

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

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

если ты exec -cl bash, A пустой.

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

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

cd ~
source .bashrc

Я написал набор сценариев, которые назвал bash_magic, которые автоматизируют этот процесс во многих оболочках. Если вы обновите файл оболочки в каталоге оболочки bash magic ( .bash.dпо умолчанию), он автоматически загрузит обновление при следующем запросе. Итак, как только вы внесете изменения, просто нажмите Enter/ return key, и будут получены все обновления.

TL; DR:
. ~/.bashrc сливает новое и старое вместе.
exec bash использовать только новые .bashrc.
Посмотрите, какой из них соответствует вашим потребностям.

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

alias ..='source ~/.bashrc'

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

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