что такое `env <command>` делать?

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

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

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

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

Эта команда

 env name=value name2=value2 program and args 

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

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

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

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

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

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