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


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

. .profile

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

спасибо

5 101

5 ответов:

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

source ~/.profile

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

cd 
source .bash_profile

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

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

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

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

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

source ~/.bash_profile

или

. ~/.bash_profile

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

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

sh myscript.sh 

или

. myscript.sh

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

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

.myscript.sh
.

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

#/bin/bash

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

Я надеюсь, что это очищает некоторые из общего непонимания! :Д Удачи Вам!

попробуй:

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