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


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.