Если ваша работа предполагает делать вещи с помощью командной строки в Linux, то скорее всего, вы будете использовать оболочку Bash. Знаете ли вы, что есть среда, связанная с процессами, которые выполняются через оболочку? И, если вы хотите, вы можете настроить эту среду, специально для выполнения этой задачи. В этой статье мы рассмотрим утилиту командной строки env, она не только позволяет получить доступ к среде оболочки, но и позволяет вносить изменения в ней, как в случае необходимости.
Но прежде чем мы это сделаем, стоит отметить, что все команды и инструкции, упомянутые в данном руководстве, были протестированы на оболочке Bash, работающие на Ubuntu 16.04 LTS.
Команда env в Linux
По определению, команда env позволяет запускать программу в измененной среде. Ниже приведен синтаксис команды, как уже упоминалось на странице man:
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
И вот что страница man говорит о env:
Set each NAME to VALUE in the environment and run COMMAND.
Примеры должны дать вам лучшее представление о том, как эта команда работает:
Q1. Как получить доступ ко всем переменным окружения, используя команду env?
Bash среда, как вы уже знаете, состоит из записей VARNAME = VALUE. Чтобы получить доступ ко всем переменным окружения, а также значения, связанные с ними, выполните команду env без опции.
env
Вот вывод из приведенных выше команд в нашем случае:
root@destroyer:~# env SHELL=/bin/bash TERM=xterm USER=destroyer MAIL=/var/mail/destroyer PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin PWD=/root LANG=en_US SHLVL=1 HOME=/root LANGUAGE=en_US: LOGNAME=destroyer HISTTIMEFORMAT=%h %d %H:%M:%S _=/usr/bin/env
Q2. Как временно изменить окружающую среду с помощью env?
Ключевая особенность env предлагает возможность временно изменить условия для процесса. Например, мы создали небольшой исполняемый процесс который отображает значение переменной окружения USER при выполнении.
Вот вывод в обычном сценарии:
root@destroyer: ~/htf-dayly$ ./env USER: destroyer
Теперь, то что мы сделали, мы использовали команду ENV временно изменить значение переменной окружения USER c «destroyer» на «HTF» для исполняемого процесса. Ниже приводится команда, которую мы использовали в этом случае:
env USER=HTF ./env
А вот выход производится в этом случае:
root@destroyer: ~/htf-dayly$ env USR=HTF ./env USER: HTF
Таким образом, вы можете увидеть, что исполняемый файл возвращается новое значение.
Q3. Как сделать, чтобы процесс игнорировал существующую среду с помощью env?
Если вы хотите, вы можете также сделать, чтобы процесс игнорировал существующую/унаследованную среду, и начать с пустой вместо этого. Это может быть сделано с помощью вариант -i или –ignore-environment.
Например:
root@destroyer: ~/htf-dayly$ env -i ./env USER: SORRY, No value
Q4. Как сделать при помощи команды env использовать NUL вместо символа новой строки при выходе?
В первом примере выше, был вывод строк, полученные с помощью команды env разделяются символом новой строки. Тем не менее, если вы хотите, вы можете сделать env использовать символ NUL как разделитель. Эта функция может быть доступна с помощью опции –null в командной строке.
env --null
Ниже приведен пример экрана:
root@destroyer:~# env --null SHELL=/bin/bashTERM=xtermUSER=destroyerMAIL=/var/mail/destroyerPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/binPWD=/rootLANG=en_USS HLVL=1HOME=/rootLANGUAGE=en_US:LOGNAME=destroyerHISTTIMEFORMAT=%h %d %H:%M:%S _=/usr/bin/envroot@destroyer:~#
Q5. Как узнать ошибку, основываясь на состоянии команды вывода env?
Команда env производит следующие коды вывода: 0, 125, 126 и 127. Ниже приведены описания ошибок, связанных с ними:
0 if no COMMAND is specified and the environment is output 125 if ‘env’ itself fails 126 if COMMAND is found but cannot be invoked 127 if COMMAND cannot be found
В этом случае, если вы получите код ошибки, кроме упомянутых выше, то это состояние вывода возвращается в процессе/команде, которая была выполнена в модифицированной среде.
Вывод
Если вы полный новичок командной строки, есть вероятность, что вы не будете требовать этого инструмента на ежедневной основе. Тем не менее, это не значит, что не стоит знать – на самом деле, env помогает во многих ситуациях. Примеры, которыми мы поделились в этой статье достаточно, чтобы дать вам понимание команды. Для получения дополнительной информации, используйте страницу man, или лучше, выполните следующую команду:
info coreutils env invocation