Intereting Posts
Ошибка Ubuntu DPKG Ошибка ROOT_MISMATCH после следующих часто задаваемых вопросов Необходимо запустить Chrome с помощью команды google-chrome -disable-bundled-ppapi-flash, чтобы запустить ее после обновления ядра XBMC Читает только 994 фильма из 1024 MSI GE70 Яркость экрана Программное обеспечение, отображающее нажатие клавиатуры на рабочий стол Почему я не могу использовать bash свободно после использования утилиты «At»? (Невозможно вставить stdin до ctrl + c) Как отключить всплывающее окно «Закройте этот терминал?» При закрытии терминала? Почему мой ноутбук перезагружается вместо того, чтобы просыпаться после возобновления с приостановки? Ввод специального символа © / copyright? Проблемы при запуске deviceQuery Cuda SDK Где я могу купить телефон Ubuntu, чтобы начать разработку приложений? Каков наилучший способ узнать, как использовать Ubuntu с терминалом? Игнорировать «Плохо: новый и старый пароль слишком похожи» Ноутбук не будет в спящем режиме, когда аккумулятор будет критическим

Не удается успешно запустить .bashrc из сценария оболочки

Обычно мы можем использовать исходный файл ~/.bashrc используя эту команду

 source ~/.bashrc 

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

мой код оболочки:

 #!/bin/bash chmod a+x ~/.bashrc source ~/.bashrc 

Также попытался .[dot] вместо source . Тот же результат

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

Напротив, команда source не запускает новый экземпляр оболочки, но использует текущую оболочку, поэтому изменения остаются.

Если вам нужен ярлык для чтения вашего .bashrc, используйте функцию оболочки или псевдоним вместо сценария оболочки, например

 alias brc='source ~/.bashrc' 

Пытаться:

 exec bash 

Это должно перезагрузить ~ / .bashrc, ~ / .bash_aliases и т. Д.

Обычно запускается ваш .bashrc :

 # If not running interactively, don't do anything [ -z "$PS1" ] && return 

Поскольку у вашего скрипта нет набора PS1 (потому что он не является интерактивным), он не сбрасывает путь, потому что он выйдет раньше. Чтобы продемонстрировать, измените свой скрипт:

  #!/bin/bash chmod a+x ~/.bashrc PS1='$ ' source ~/.bashrc 

теперь это позволит вашим скриптам работать с новым .bashrc . Примечание: как только ваш скрипт выйдет, env будет настроен на то, что было до начала сценария. Изменения будут отражены при следующем запуске терминала.

Ни один из других методов не работал для меня [ source /path/to/file vs. . ./path/to/file , alias и т. д.], пока, благодаря этому руководству, я не обнаружил, что используя:

#!/usr/bin/env bash shebang

вместо простого #!/usr/bin/env аргументы передаются интерпретатору, который, я думаю, является ключевым здесь – см. этот документ для получения дополнительной информации.

В любом случае, если исходные команды в любой форме не работают на вас, попробуйте проверить свой shebang, это может быть проблемой 🙂

Я придумал это решение, столкнувшись с этим:

 function re_source { xdotool type 'source ~/.bashrc' xdotool key Return } 

Меня устраивает. Вы можете вызвать это из других функций bash. Возможно, это единственный способ «re_source» без вызова новой оболочки.