Как перезагрузить.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
альтернативы
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.
Для меня то, что работает, когда я меняю ПУТЬ, это: 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
пустой.
Я думаю, что это лучший способ сделать свою работу.
Я написал набор сценариев, которые назвал bash_magic, которые автоматизируют этот процесс во многих оболочках. Если вы обновите файл оболочки в каталоге оболочки bash magic (
.bash.d
по умолчанию), он автоматически загрузит обновление при следующем запросе. Итак, как только вы внесете изменения, просто нажмите
Enter
/
return
key, и будут получены все обновления.
TL; DR:
. ~/.bashrc
сливает новое и старое вместе.
exec bash
использовать только новые
.bashrc
.
Посмотрите, какой из них соответствует вашим потребностям.
У меня лично есть
alias ..='source ~/.bashrc'
в моем bashrc, так что я могу просто использовать "..", чтобы перезагрузить его.