что делает `env <команда>`?

37

Что env ls -alделает команда ?

У меня был тест Linux и возник вопрос: «Как запустить команду напрямую, но не ее псевдоним?»
Я знал, что существует решение, такое как префиксная команда с каким-то специальным символом, но я забыл его. Теперь я знаю, что это так \. (читать из этого поста ).

Но я также помню, что где-то читал, что, чтобы избавиться от псевдонима, мы можем использовать префикс команды env. Я сделал это, и, кажется, работает, но мой ответ был квалифицирован как неправильный. Я читал infoи manдальше env, но не слишком много понял.

Что envделает и точно env <command>без каких-либо аргументов для envсебя?

ALZ
источник
Как примечание, 3 способа сделать это , что я могу думать являются env <command>, command <command>и \<command>. По моему мнению, если какой-то тест сказал, что env <command>он недействителен, то этот тест не пройден.
Патрик
@ Патрик: Он не сломан, потому что, как сказал Крис, может быть псевдоним commandили envкоторый может сделать `\` единственным приемлемым ответом.
Пьер Арло
1
@ArlaudPierre и `\` не определены в posix (как экранирование псевдонима), поэтому они не переносимы. Так что это не более приемлемо, чем другие.
Патрик
@ Патрик: правда, правда. Теперь мы должны знать точный периметр теста, чтобы сказать это. Но в любом случае, сочтите, что ответ "env" не является приемлемым, не очень честный, я должен согласиться с вами в этом.
Пьер Арло
Ребята, тест тоже проверил человек (LPI-сертифицированный экс-сисадмин, который теперь обучает других Linux) :) Я пожаловался верификатору, пошел manи не понял, что envименно делает. После этого поста - понятно и мой ответ был рассмотрен (принят). Спасибо всем!
ALZ

Ответы:

38

Эта команда

env name=value name2=value2 program and args

запускает команду program and argsсо средой, сформированной путем расширения текущей среды переменными среды и значениями, обозначенными name=valueи name2=value2. Если вы не включите никаких аргументов, таких как name=value, то текущая среда передается без изменений.

Ключевым моментом, который происходит с псевдонимами, является то, что env является внешней командой, поэтому у него нет «знания» псевдонимов: псевдонимы являются конструкцией оболочки, которые не являются частью обычной модели процесса и не влияют на программы, которые напрямую запускаются не-оболочечными программами (например, env ). окр просто проходит program and argumentsк ехес вызова (например , execvp , который будет искать путь к program).

По сути, использование env, подобного этому, - это (в основном) независимый от оболочки способ избежать псевдонимов, функций оболочки, встроенных команд оболочки и любых других элементов функциональности оболочки, которые могут заменить или переопределить аргументы позиции команды (например, имена программ) - если только Конечно, envэто псевдоним или функция оболочки! Если вы беспокоитесь о envпсевдониме, вы можете указать полный путь (например /usr/bin/env, хотя он может отличаться).

Крис Джонсен
источник
24

Другое важное использование env(кроме обхода поиска псевдонимов команд) - поиск PATHкоманды. Это важно, когда требуются абсолютные пути, но они варьируются от системы к системе.

Например, начинать сценарий Bash #!/bin/bashможно, в то время #!bashкак нет, несмотря на /binто , что он включен в PATHкаждую разумную систему.

Я часто сталкивались с этим в программах Python, которые обычно начинаются с , #!/usr/bin/env pythonчтобы избежать указания полного, зависимые от системы путь к pythonисполняемому (примечание, однако, что она по- прежнему требует , чтобы envвосседающий в /usr/binэто, однако , гораздо чаще , чем расположение питона двоичный).

misberner
источник