Перезагрузить .profile в bash shell script (в unix)?

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

. .profile

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

Спасибо

Ответ 1

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

source ~/.profile

Ответ 2

Попробуйте следующее:

cd 
source .bash_profile

Ответ 3

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

Ответ 4

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

  • Выполняете ли вы это непосредственно в терминале или в script?
  • Как вы запускаете это в script?

Ad. 1)

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

source ~/.bash_profile

или

. ~/.bash_profile

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

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

sh myscript.sh 

или

. myscript.sh

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

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

.myscript.sh

команды.

Чтобы убедиться, что вы не используете script на подходе, вы можете использовать эту функцию. (Снова пример для оболочки 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 Удачи!

Ответ 5

Try:

#!/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 [email protected]
echo my script continues here
' arg0 "[email protected]"