Розглянемо конкретний приклад. grep
Команда використовує змінну оточення з ім'ям , GREP_OPTIONS
щоб задати параметри по замовчуванню.
Тепер. Враховуючи, що файл test.txt
містить такі рядки:
line one
line two
виконання команди grep one test.txt
повернеться
line one
Якщо запустити grep з -v
опцією, вона поверне невідповідні лінії, тому вихід буде
line two
Зараз ми спробуємо встановити параметр із змінною середовища.
Змінні середовища, встановлені без export
, не будуть успадковані в середовищі команд, які ви викликаєте.
GREP_OPTIONS='-v'
grep one test.txt
Результат:
line one
Очевидно, варіант -v
не вдався до цього grep
.
Ви хочете використовувати цю форму, коли ви встановлюєте змінну лише для оболонки, яка використовується, наприклад, якщо for i in * ; do
ви не хочете експортувати $i
.
Однак змінна передається в середовище конкретного командного рядка, так що ви можете це зробити
GREP_OPTIONS='-v' grep one test.txt
що поверне очікуване
line two
Ви використовуєте цю форму для тимчасової зміни середовища цього конкретного примірника запущеної програми.
Експорт змінної призводить до спадкування змінної:
export GREP_OPTIONS='-v'
grep one test.txt
повертається зараз
line two
Це найпоширеніший спосіб встановлення змінних для використання згодом запущених процесів в оболонці
Це все робилося в баш. export
- це вбудований баш; VAR=whatever
є синтаксисом bash. env
з іншого боку, сама по собі програма. Коли env
телефонують, трапляються такі речі:
- Команда
env
виконується як новий процес
env
змінює середовище та
- називає команду, яка була надана як аргумент.
env
Процес замінюється command
процесом.
Приклад:
env GREP_OPTIONS='-v' grep one test.txt
Ця команда запустить два нові процеси: (i) env та (ii) grep (власне, другий процес замінить перший). З точки зору grep
процесу, результат точно такий же, як і біг
GREP_OPTIONS='-v' grep one test.txt
Однак ви можете використовувати цю ідіому, якщо ви перебуваєте за межами bash або не хочете запускати іншу оболонку (наприклад, коли ви використовуєте exec()
сімейство функцій, а не system()
виклик).
Додаткова примітка #!/usr/bin/env
Це також, чому використовується ідіома #!/usr/bin/env interpreter
, а не #!/usr/bin/interpreter
. env
не вимагає повного шляху до програми, оскільки вона використовує execvp()
функцію, яка здійснює пошук через PATH
змінну так само, як це робить оболонка, а потім замінює себе командою run. Таким чином, з його допомогою можна з’ясувати, де на шляху «сидить» інтерпретатор (наприклад, perl чи python).
Це також означає, що, змінюючи поточний шлях, ви можете впливати, який варіант пітона буде називатися. Це робить можливим наступне:
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
замість запуску Calibre призведе до
I am an evil interpreter!
export key=value
розширений синтаксис і не повинен використовуватися в портативних сценаріях (тобто#! /bin/sh
).