Як встановити змінну середовища лише на час дії сценарію?


127

На Linux (Ubuntu 11.04) в bash, чи можна тимчасово встановити змінну середовища, яка буде відрізнятися лише від звичайної змінної протягом тривалості сценарію? Наприклад, у скрипті оболонки зробіть додаток, який зберігає на портаті HOME, тимчасово встановивши HOME у папку в поточному робочому каталозі, а потім запустивши програму.


5
Було б важче, якби ви хотіли, щоб цей параметр тривав понад тривалість сценарію
Немо

Відповіді:


119
VAR1=value1 VAR2=value2 myScript args ...

2
Я робив це сам багато разів, щоб бігати vblank_mode=0 glxgears. Це працює, але він також говорить vblank_mode=0: command not foundпісля запуску, тоді як попереднє перед цим envне викликає. [тестування ...] Мабуть, zsh це не любить (але він все ще використовує його правильно), але bash добре з цим. Я здогадуюсь, я зараз з цим envметодом піду .
Чиното Вокро

2
зі сценаріями він працює, але як щодо VAR1="hello" echo $VAR1нічого не повертає?
Зібрі

2
@Zibri йдеться про те, коли відбувається розширення. Напевно, ви можете зробити щось подібне:VAR1="hello" bash -c 'echo $VAR1'
cybergrind

Запропоновано показати, що це можливо навіть для декількох змінних середовищ.
Бінарус

70
env VAR=value myScript args ...

18
АбоVAR=value myScript args ...
Rockallite

9
1. Чому, PATH=$PATH:XYZ echo $PATH | grep XYZоднак, немає жодного результату? 2. У чому різниця між використанням та не використанням env?
qubodup

18
тому що оболонка розширює змінну PATH перед виконанням команди echo. Вам потрібно затримати це розширення. Один із способів: PATH=$PATH:XYZ sh -c 'echo $PATH' | grep XYZ- Ключові слова тут
Glenn jackman

14
Яка різниця між використанням envта нею?
Мохаммед Нурелдін

Здається, це не працює в онлайні, якIFS=$'\n' for l in lines; do ... done
drevicko

31

Просто кажу

export HOME=/blah/whatever

в точці сценарію, де ви хочете, щоб зміни відбулися. Оскільки кожен процес має свій набір змінних середовища, це визначення автоматично перестане мати будь-яке значення, коли сценарій припиняється (а з ним і екземпляр bash, що має змінене середовище).


11
Це вводить в оману. exportпередасть змінну до підшарів, але вона не контролює батьківську оболонку. Якщо ви пишете сценарій, який починається з "#! / Bin / sh" або подібного, будь-яка змінна, яку ви встановите, зникне, коли сценарій закінчується.
яскравець

1
@brightlancer, це правда, але, здається, не суперечить нічого, що я написав. (За винятком можливості, що сценарій може запустити фоновий процес, але я думаю, що це вищий рівень складності ОП і лише заплутається).
hmakholm залишився над Монікою

5
Експорт непотрібний. Також ваша відповідь працює лише в тому випадку, якщо його скрипт викликає інтерпретатора (#! / Bin / sh тощо). Якщо його "сценарій" не відповідає, то те, що ви йому щойно сказали, зберігатиметься і після кінця сценарію. Ось чому я сказав, що ваша відповідь вводить в оману - це може бути правильним, не може, але це, безумовно, частина, яка є непотрібною і заплутаною, тому що це може змусити когось думати, що "експорт" є необхідним елементом, який він шукав.
яскравець

7
@brightlancer: Експорт необхідний, якщо сценарій ОП посилається на скрипти, які самі залежать від $ HOME, і я не наважувався вважати, що це не так. Крім того, bash створить підзарядку для запуску сценарію, навіть якщо сценарій не має рядка shebang, а є лише текстовим файлом із встановленим бітом виконання. Спробуйте - змінні призначення в скрипті не видно в оболонці, з якої ви викликаєте. Тільки якщо ви явно sourceскрипт, він буде виконаний тією ж оболонкою, в яку ви введете команду.
hmakholm залишився над Монікою

4
@brightlancer: Експорт необхідний, якщо він хоче $HOMEуспадкувати будь-які команди, виконані зі сценарію. А якщо він цього не робить, а налаштування $HOMEпризначено лише на користь самого сценарію, то, мабуть, йому буде краще модифікувати сценарій, щоб він посилався на щось інше, ніж на $HOME.
Кіт Томпсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.