Перезавантажити .profile в скрипті bash shell (в unix)?


130

Я новачок в скрипті, що базується, і зіткнувся з проблемою. Я знаю, що можу завантажити файл ".profile", виконавши:

. .profile

але я намагаюся виконати те саме в баш-скрипті, який я пишу, і це просто не працює. Будь-які ідеї? Що ще я можу надати для уточнення?

Дякую


Як вказує Ігнасіо нижче, ваш сценарій працює в нижній частині. Підрозділ не може змінити основну оболонку (дочірній процес не може змінити свого батьківського). Тож вам потрібно "джерело" сценарію, використовуючи "". команда (яку також можна записати як "джерело"). Отже, якщо ваш скрипт хоче, скажімо, змінити змінні середовища, вам потрібно зробити щось на кшталт "вихідний таємничий сценарій" або ". Таємничий скрипт" (вони обоє означають те саме). Це змінить середовище вашої основної оболонки. (Що я думаю, це те, що ви намагаєтесь зробити, дайте мені знати, якщо це неправильно.)
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

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


4

Сценарій bash працює в окремій підзахисті. Для того, щоб зробити цю роботу, вам потрібно буде також джерело цього іншого сценарію.


Я не впевнений (все ще нове у всьому цьому), що ви точно маєте на увазі під "джерелом" - з іншого сценарію. Чи можете, будь ласка, трохи розширити це. Однак я спробував: $. ~ / .профіль $. / і т.д. / профіль без успіху. Дуже дякую.
Амір Рустамзаде

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.