3

После просмотра справочной страницы команды env мне было любопытно увидеть пример служебной программы, которая будет использоваться при использовании, указанном ниже?

СИНТАКСИС

env [-i] [имя = значение ...] [утилита [аргумент ...]]

ОПИСАНИЕ

env выполняет утилиту после изменения среды, как указано в командной строке. Опция name = value указывает переменную окружения name со значением value. Опция `-i 'заставляет env полностью игнорировать окружение, которое он наследует.

2 ответа2

5

Обычно используется для запуска интерпретаторов, используя тот факт, что env будет искать $ PATH для команды, которую ей говорят запустить. Так как притон линия требуется абсолютный путь будет указано, и так как местоположение различных переводчиков perl bash python может отличаться много, он является общим для использования:

#!/usr/bin/env perl

вместо того, чтобы пытаться угадать, является ли это /bin/perl , /usr/bin/perl , /usr/local/bin/perl , /usr/local/pkg/perl , /fileserver/usr/bin/perl или /home/MrDaniel/usr/bin/perl в системе пользователя ...

С другой стороны, env почти всегда находится в /usr/bin/env . (За исключением случаев, когда это не так; некоторые системы могут использовать /bin/env , но это довольно редкий случай и происходит только в системах, отличных от Linux.)


Другой способ - быстро очистить среду с помощью опции -i . В унаследованных сценариях sysvinit , которые являются просто сценариями оболочки, часто запускаемыми непосредственно системным администратором, необходимо убедиться, что среда администратора не распространяется на запущенный демон. (Например, мошеннические $TZ или $HOME могут привести к путанице, особенно с определенными демонами cron .)

В этом случае initscript готовит короткую среду и запускает демон, используя что-то вроде:

env -i "PATH=/bin:/usr/bin" "LANG=$system_locale" /usr/sbin/crond
1

Это действительно любая программа. Это наиболее полезно для всех тех, кто использует любое значение, определенное как переменная среды. Вы можете передать значение переменной среды любой программе, фактически не устанавливая ее в своей оболочке (и, таким образом, влиять на другие программы в дальнейшем).

env ls запускает ls без изменения среды. env -i ls сбрасывает среду. В моей системе это удаляет цвета из его вывода, так как это сбрасывает LSCOLORS и CLICOLOR . env LSCOLORS=GxfxcxhxdxegdggbgdAhAg ls будет запускать ls , передавая указанную строку LSCOLORS и, возможно, изменяя цвет вывода ls .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .