Перезагрузить .profile в скрипте оболочки bash (в unix)? - PullRequest
112 голосов
/ 18 июля 2010

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

. .profile

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

Спасибо

Ответы [ 5 ]

171 голосов
/ 20 февраля 2012

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

source ~/.profile
9 голосов
/ 26 марта 2014

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

cd 
source .bash_profile
3 голосов
/ 18 июля 2010

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

2 голосов
/ 23 октября 2017

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

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

Объявление.1)

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

source ~/.bash_profile

или

. ~/.bash_profile

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

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

sh myscript.sh 

или

. myscript.sh

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

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

.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 Удачи!

1 голос
/ 18 июля 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 "$@"
...