Обычно мы можем получить исходный ~/.bashrc
файл с помощью этой команды
source ~/.bashrc
но если я напишу это в сценарии оболочки и выполню, ничего не произойдет. Почему?
Есть какой-либо способ сделать это?
Мой сценарий:
#!/bin/bash
chmod a+x ~/.bashrc
source ~/.bashrc
Также попробовал .
(точка) вместо source
. Тот же результат.
source ~/.bashrc
в оболочке, из которой вы хотите изменить среду. Вы не можете изменить его из другого процесса. Возможно (глобально) добавление этого псевдонима может быть частью процесса установки вашего GUI.Ваш
.bashrc
обычно начинается:Поскольку ваш сценарий не имеет установленного PS1 (потому что он не интерактивный), он не сбрасывает путь, потому что он выходит рано. Чтобы продемонстрировать, измените ваш скрипт:
теперь это позволит вашим скриптам работать с новым
.bashrc
. Примечание: как только ваш скрипт завершится, env будет установлен на то, что было до запуска скрипта. Изменения будут отражены при следующем запуске терминала.источник
.bashrc
использует более надежный способ проверить, является ли оболочка интерактивной./etc/bash.bashrc
все еще имеет тест PS1.Пытаться:
Это должно перезагрузить ~ / .bashrc, ~ / .bash_aliases и т. Д.
источник
source
но уничтожает любые переменные и такие, которые пользователь установил вручную - что может или не может быть то, что вы хотите.exec bash
, как я понимаю, команда после этого все еще будет в тех же настройках bash, что и раньше?Я хочу дополнить ответ Рави :
Такое поведение характерно для Ubuntu (и, вероятно, большинства производных дистрибутивов), поскольку ваш
~/.bashrc
файл по умолчанию начинается с короткого замыкания, Ubuntu 18.04, например:Это остановит оценку файла, если он работает в неинтерактивной оболочке, как в случае с вашим сценарием, поскольку все сценарии выполняются в неинтерактивной оболочке , и впоследствии каждый файл
source
унаследует это свойство.eval
мотыгаЯ обнаружил уродливый хак для обхода Ubuntu специально, используя
eval
вместоsource
:Он просто пропускает несколько первых строк и оценивает оставшуюся часть,
~/.bashrc
поэтому остальные оцениваются и изменяют текущее выполнение.Имейте в виду, что это магическое число, которое может не работать во всех версиях Ubuntu; но может быть хорошим решением, если вы создаете сценарии для более или менее известных систем.
Более подходящее решение может включать использование регулярных выражений для определения конкретных битов, которые останавливают оценку.
Альтернатива Шебангу
Другая альтернатива, которая может работать лучше в некоторых сценариях, - заставить скрипт запускаться в интерактивной оболочке, добавив флаг в shebang :
Помните о нескольких вещах:
#!/usr/bin/env bash
форму , но таким образом , вы не можете запустить оболочку с аргументами .-i
имеет свой собственный набор последствий, среди которых программы будут запрашивать взаимодействие с пользователем, и это обычно не предназначено для сценариев, например, установкаdeb
пакетов может остановить сценарий приdpkg configure
запросах .set -i
иset +i
включать и выключать эту функцию там, где мне было нужно, но это не работает .источник
Ни один из других методов не работал для меня [
source /path/to/file
vs. ./path/to/file
, alias и т. Д.], Пока, благодаря этому руководству, я не обнаружил, что с помощью:#!/usr/bin/env bash
притонвместо более простого
#!/usr/bin/env
можно передавать аргументы интерпретатору, который, я думаю, является ключевым здесь - см. этот документ для получения дополнительной информации.В любом случае, если исходные команды в любой форме не работают для вас, попробуйте проверить свой шебанг, это может быть проблемой :)
источник