Перезагрузить .profile в сценарии оболочки bash (в unix)?

Я новичок в написании сценариев оболочки bash и столкнулся с проблемой. Я знаю, что могу перезагрузить файл «.profile», просто выполнив:

. .profile

но я пытаюсь выполнить то же самое в сценарии bash, который я пишу, и он просто не работает. Любые идеи? Что-нибудь еще, что я могу предоставить, чтобы уточнить?

Спасибо


person Amir Rustamzadeh    schedule 18.07.2010    source источник
comment
Как указывает Игнасио ниже, ваш скрипт работает в подоболочке. Подоболочка не может изменять основную оболочку (дочерний процесс не может изменять своего родителя). Поэтому вам нужно получить сценарий, используя файл . команда (которая также может быть записана как источник). Поэтому, если ваш скрипт хочет, скажем, изменить переменные среды, вам нужно сделать что-то вроде исходного myscript или . myscript (они оба означают одно и то же). Это изменит среду вашей основной оболочки. (Что я думаю, это то, что вы пытаетесь сделать, дайте мне знать, если это неправильно.)   -  person bstpierre    schedule 20.07.2010
comment
Я получил ответ на ваш вопрос :)   -  person Kellen Stuart    schedule 18.10.2016


Ответы (5)


Попробуйте это, чтобы перезагрузить текущую оболочку:

source ~/.profile
person kofriel    schedule 19.02.2012
comment
У вас есть альтернативное решение? Потому что использование команды source запустит файл как сценарий... В худшем случае, если кто-то будет использовать назначение переменной, например MyVar="$foo$MyVar" в своем профиле bash_, тогда source ~/.profile даст конечный результат MyVar="$foo$MyVar$MyVar", следовательно, $MyVar впоследствии будет иметь неправильное значение. (Независимо от плохой практики, просто попросите альтернативное решение) - person Jeffrey Mvutu Mabilama; 01.10.2018

Попробуй это:

cd 
source .bash_profile
person girardengo    schedule 26.03.2014

Пара проблем возникает при попытке перезагрузить/исходный файл ~/.profile. [Это относится к Ubuntu Linux — в некоторых случаях детали команд могут отличаться]

  1. Вы запускаете это прямо в терминале или в скрипте?
  2. Как запустить это в скрипте?

Ad. 1)

Запуск этого непосредственно в терминале означает, что подоболочка не будет создана. Таким образом, вы можете использовать две команды:

source ~/.bash_profile

or

. ~/.bash_profile

В обоих случаях это обновит среду содержимым файла .profile.

Объявление 2) Вы можете запустить любой скрипт bash, позвонив

sh myscript.sh 

or

. myscript.sh

В первом случае будет создана подоболочка, которая не повлияет на переменные среды вашей системы и будет видна только процессу подоболочки. После завершения команды подоболочки ни один из экспортов и т.п. применяться не будет. ЭТО РАСПРОСТРАНЕННАЯ ОШИБКА, ИЗ-ЗА которой МНОГИЕ РАЗРАБОТЧИКИ ТЕРЯЮТ МНОГО ВРЕМЕНИ.

Чтобы ваши изменения, примененные в вашем скрипте, вступили в силу для глобальной среды, скрипт должен быть запущен с

.myscript.sh

команда.

Чтобы убедиться, что ваш скрипт не запускается в подоболочке, вы можете использовать эту функцию. (опять же пример для оболочки Ubuntu)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

Я надеюсь, что это устраняет некоторые из распространенных недоразумений! :D Удачи!

person twboc    schedule 23.10.2017

Сценарий bash выполняется в отдельной подоболочке. Чтобы выполнить эту работу, вам также потребуется источник этого другого сценария.

person Ignacio Vazquez-Abrams    schedule 18.07.2010
comment
Я не уверен (все еще новичок во всем этом), что именно вы подразумеваете под исходным кодом другого сценария. Не могли бы вы немного расширить это. Однако я пробовал: $ . ~/.профиль $ . /etc/profile безуспешно. Большое спасибо. - person Amir Rustamzadeh; 18.07.2010
comment
@amirrustan: Ваш сценарий должен будет получить ваш файл .profile примерно так: . $HOME/.profile, и вам также нужно будет запустить свой сценарий, также получив его. Что-то вроде . /path/to/yourscript - person Dennis Williamson; 18.07.2010
comment
@amirrustam, пожалуйста, прочитайте superuser.com/questions/176783/ - person lesmana; 23.08.2010

Пытаться:

#!/bin/bash
# .... some previous code ...
# help set exec | less
set -- 1 2 3 4 5  # fake command line arguments
exec bash --login -c '
echo $0
echo $@
echo my script continues here
' arg0 "$@"
person tilo    schedule 18.07.2010