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


130

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

. .profile

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

Спасибо


Как указывает ниже Игнасио, ваш скрипт работает в подоболочке. Подоболочка не может изменять основную оболочку (дочерний процесс не может изменять своего родителя). Таким образом, вам нужно "исходить" скрипт с помощью символа "." команда (которая также может быть написана как «источник»). Итак, если ваш сценарий хочет, скажем, изменить переменные среды, вам нужно сделать что-то вроде «исходный myscript» или «. Myscript» (они оба означают одно и то же). Это изменит среду вашей основной оболочки. (Я думаю, это то, что вы пытаетесь сделать, дайте мне знать, если это неправильно.)
bstpierre

1
Я получил свой ответ на свой вопрос :)
Каньон Колоб

Ответы:


195

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

source ~/.profile

1
У вас есть альтернативное решение? Потому что использование sourceкоманды запустит файл как скрипт ... В худшем случае, если кто-то будет использовать присвоение переменной, как MyVar="$foo$MyVar"в своем bash_profile, то source ~/.profileдаст конечный результат MyVar="$foo$MyVar$MyVar", следовательно, $MyVarвпоследствии будет иметь неправильное значение. (Независимо от плохой практики, просто попросите альтернативное решение)
Джеффри Мвуту Мабилама


5

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

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

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

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

source ~/.bash_profile

или

. ~/.bash_profile

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

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

sh myscript.sh 

или

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


4

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


Я не уверен (все еще новичок во всем этом), что именно вы подразумеваете под «источником» - в другом сценарии. Не могли бы немного рассказать об этом. Однако я пробовал: $. ~ / .profile $. / etc / profile безуспешно. Огромное спасибо.
Амир Рустамзаде

1
@amirrustan: Ваш скрипт должен будет исходить из вашего .profileфайла примерно так: . $HOME/.profileи вам нужно будет запустить свой скрипт с его источника. Что-то вроде. /path/to/yourscript
Приостановлено до дальнейшего уведомления.

1
@amirrustam, пожалуйста, прочтите superuser.com/questions/176783/…
lesmana

1

Пытаться:

#!/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 "$@"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.