2010-07-18 3 views
98

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

. .profile 

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

Thanks

+0

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

+1

Я получил свой ответ из вашего вопроса :) –

ответ

149

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

source ~/.profile 
3

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

+0

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

+1

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

+1

@amirrustam, пожалуйста, прочитайте http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash- сценарий/176788 # 176788 – lesmana

1

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

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

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

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

source ~/.bash_profile 

или

. ~/.bash_profile 

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

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

sh myscript.sh 

или

. myscript.sh 

В первом случае это будет создавать подоболочку, которые не будут влиять на переменные среды вашего и они будут видны только для процесса подоболочки. После завершения команды 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 Удачи!

Смежные вопросы