Thank you for reading this post, don't forget to subscribe!
По определению, команда env позволяет запускать программу в измененной среде. Ниже приведен синтаксис команды, как уже упоминалось на странице man:
1 |
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...] |
И вот что страница man говорит о env:
1 |
Set each NAME to VALUE in the environment and run COMMAND. |
Примеры должны дать вам лучшее представление о том, как эта команда работает:
Q1. Как получить доступ ко всем переменным окружения, используя команду env?
Bash среда, как вы уже знаете, состоит из записей VARNAME = VALUE. Чтобы получить доступ ко всем переменным окружения, а также значения, связанные с ними, выполните команду env без опции.
1 |
env |
Вот вывод из приведенных выше команд в нашем случае:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 при выполнении.
Вот вывод в обычном сценарии:
1 2 |
root@destroyer: ~/htf-dayly$ ./env USER: destroyer |
Теперь, то что мы сделали, мы использовали команду ENV временно изменить значение переменной окружения USER c «destroyer» на «HTF» для исполняемого процесса. Ниже приводится команда, которую мы использовали в этом случае:
1 |
env USER=HTF ./env |
А вот выход производится в этом случае:
1 2 |
root@destroyer: ~/htf-dayly$ env USR=HTF ./env USER: HTF |
Таким образом, вы можете увидеть, что исполняемый файл возвращается новое значение.
Q3. Как сделать, чтобы процесс игнорировал существующую среду с помощью env?
Если вы хотите, вы можете также сделать, чтобы процесс игнорировал существующую/унаследованную среду, и начать с пустой вместо этого. Это может быть сделано с помощью вариант -i или –ignore-environment.
Например:
1 2 |
root@destroyer: ~/htf-dayly$ env -i ./env USER: SORRY, No value |
Q4. Как сделать при помощи команды env использовать NUL вместо символа новой строки при выходе?
В первом примере выше, был вывод строк, полученные с помощью команды env разделяются символом новой строки. Тем не менее, если вы хотите, вы можете сделать env использовать символ NUL как разделитель. Эта функция может быть доступна с помощью опции –null в командной строке.
1 |
env --null |
Ниже приведен пример экрана:
1 2 3 4 |
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. Ниже приведены описания ошибок, связанных с ними:
1 2 3 4 |
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 |
В этом случае, если вы получите код ошибки, кроме упомянутых выше, то это состояние вывода возвращается в процессе/команде, которая была выполнена в модифицированной среде.