Что env ls -al
делает команда ?
У меня был тест Linux и возник вопрос: «Как запустить команду напрямую, но не ее псевдоним?»
Я знал, что существует решение, такое как префиксная команда с каким-то специальным символом, но я забыл его. Теперь я знаю, что это так \
. (читать из этого поста ).
Но я также помню, что где-то читал, что, чтобы избавиться от псевдонима, мы можем использовать префикс команды env
. Я сделал это, и, кажется, работает, но мой ответ был квалифицирован как неправильный. Я читал info
и man
дальше env
, но не слишком много понял.
Что env
делает и точно env <command>
без каких-либо аргументов для env
себя?
env <command>
,command <command>
и\<command>
. По моему мнению, если какой-то тест сказал, чтоenv <command>
он недействителен, то этот тест не пройден.command
илиenv
который может сделать `\` единственным приемлемым ответом.man
и не понял, чтоenv
именно делает. После этого поста - понятно и мой ответ был рассмотрен (принят). Спасибо всем!Ответы:
Эта команда
запускает команду
program and args
со средой, сформированной путем расширения текущей среды переменными среды и значениями, обозначеннымиname=value
иname2=value2
. Если вы не включите никаких аргументов, таких какname=value
, то текущая среда передается без изменений.Ключевым моментом, который происходит с псевдонимами, является то, что env является внешней командой, поэтому у него нет «знания» псевдонимов: псевдонимы являются конструкцией оболочки, которые не являются частью обычной модели процесса и не влияют на программы, которые напрямую запускаются не-оболочечными программами (например, env ). окр просто проходит
program and arguments
к ехес вызова (например , execvp , который будет искать путь кprogram
).По сути, использование env, подобного этому, - это (в основном) независимый от оболочки способ избежать псевдонимов, функций оболочки, встроенных команд оболочки и любых других элементов функциональности оболочки, которые могут заменить или переопределить аргументы позиции команды (например, имена программ) - если только Конечно,
env
это псевдоним или функция оболочки! Если вы беспокоитесь оenv
псевдониме, вы можете указать полный путь (например/usr/bin/env
, хотя он может отличаться).источник
Другое важное использование
env
(кроме обхода поиска псевдонимов команд) - поискPATH
команды. Это важно, когда требуются абсолютные пути, но они варьируются от системы к системе.Например, начинать сценарий Bash
#!/bin/bash
можно, в то время#!bash
как нет, несмотря на/bin
то , что он включен вPATH
каждую разумную систему.Я часто сталкивались с этим в программах Python, которые обычно начинаются с ,
#!/usr/bin/env python
чтобы избежать указания полного, зависимые от системы путь кpython
исполняемому (примечание, однако, что она по- прежнему требует , чтобыenv
восседающий в/usr/bin
это, однако , гораздо чаще , чем расположение питона двоичный).источник