Як я можу зробити змінні середовища "експортованими" в сценарій оболонки?


54

У мене є кілька облікових записів Amazon EC2 і хочу швидко перемикати змінні, наприклад $EC2_HOME, за допомогою скрипту.

У мене встановлений такий сценарій оболонки:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

Коли я запускаю сценарій, я знаю, що EC2_HOMEце встановлено, але я думав, що за допомогою exportцього сценарію змінна палиця після завершення сценарію. Це не так, як біг echo $EC_HOMEнічого не показує.

Я знаю, що це, мабуть, дуже рудиментарні знання сценаріїв Linux, але я цього не знаю. Я намагався шукати пов'язані питання без удачі - тож вибачте, якщо це дублікат.

Відповіді:


60

Ви повинні джерело свого сценарію, за допомогою

. ./script

або

source ./script

19
Причина полягає в тому, що ваш сценарій породжує новий процес оболонки як дочірня частина поточної оболонки. Будь-які зміни середовища, які ви внесли в дочірній процес, не можуть вплинути на батьків. Коли ви використовуєте .або source, ви не породили новий дочірній процес, ви виконуєте команди в поточній оболонці.
Гленн Джекман

1
@glennjackman У мене є аналогічна проблема, і я спробував ваше рішення, але воно відключає мене від оболонки, коли я це роблю .або source. Чому це відбувається?
Патрик

7
@Patryk: можливо, у вашому скрипті є exitзаява, тому його не підходить.
enzotib

Хоча source ./scriptпрацює зовсім добре, sudo source ./script.shкаже sudo: source: command not found. Як я можу це зробити за допомогою судо?
71GA

1
@ 71GA: залежно від уподобань компіляції sudoта залежно від налаштувань конфігурації /etc/sudoersви можете або не можете зберегти ваше середовище під час виконання команд за допомогою sudo. Я пропоную вам спробувати джерело свого сценарію, а потім запустіть sudoз -Eможливістю збереження навколишнього середовища. Якщо це не спрацює, я думаю, ви можете зробити дуже мало.
enzotib

35

Під час запуску сценарію він отримує власну оболонку та власне середовище, які знову зникають, як тільки сценарій закінчується. Щоб зберегти змінні середовища довкола, введіть скрипт у вашу поточну оболонку:

$ source ./a.sh

або аналогічно (але трохи більш портативно) використовуйте команду POSIX крапки :

$ . ./a.sh

Тоді визначення будуть введені у ваше поточне середовище оболонки та успадковуються будь-якими програмами, які ви запускаєте з неї.

Щоб ближче до запуску сценарію, . a.shзнайдете a.sh шляхом пошуку каталогів у PATHзмінній оточення.


Є деякі тонкощі в тому , як вони поводяться, і буде чи .й sourceті ж (або взагалі присутній). . ./a.shбезумовно буде поводитись однаково у всіх POSIX-сумісних оболонках, але sourceі ., і, . a.shі . ./a.shможе змінюватися. Для Баша sourceі .однакові у всіх випадках; для zsh sourceзавжди спочатку перевіряє поточний каталог ; ksh по суті схожий.

Якщо ім'я сценарію вказано як шлях (містить a /), цей шлях використовується безпосередньо у всіх випадках. Найбільш портативно надійною справою є . ./scriptабо . /path/to/script.


1

Просто для запису.

Якщо ви хочете запустити скрипт з Інтернету, який експортує env до системи

Ви можете використовувати наступний формат

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

Наприклад:

source <(curl -s -L https://example.com/install.sh)

Виглядає небезпечно, але корисно, якщо ви довіряєте цьому сценарію!
Марк Стюарт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.