Подтверждение: Может быть, я неправильно понимаю, что означает «окружающая среда».
На странице руководства для env утверждается, что env - [command]
(или env -i [command]
) должен работать command
в пустой среде. Тестируя это поведение, PATH
является переменной среды (то есть частью «среды»). Но увы:
➜ ~ env - echo $PATH
/home/user/.nvm/versions/node/v15.3.0/bin:/home/user/.deno/bin:/usr/local/lib/node/nodejs/bin:/home/user/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
такой же как
➜ ~ echo $PATH
/home/user/.nvm/versions/node/v15.3.0/bin:/home/user/.deno/bin:/usr/local/lib/node/nodejs/bin:/home/user/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Итак, что происходит? Это происходит и с некоторыми другими переменными среды, такими как $SHELL
и $USER
.
Итак, может ли кто-нибудь определить «среду» и что на самом деле делает env
при использовании env - [command]
или env -i [command]
.
Обратите внимание, что env - PATH= echo $PATH
приводит к ожидаемому результату, когда не удается найти echo
на пути. Но мне странно, что я должен явно установить для этой переменной среды пустую строку, так как я якобы очищаю свою среду перед запуском [command]
.
Бонусная путаница:
env env
печатает все переменные моей среды, в то время как env - env
выводит пустой вывод (имеет смысл... среду следует i
игнорировать, но это кажется несовместимым с env - echo $PATH
печатью моей среды PATH
.)
В env -i echo $PATH
переменная расширяется вашей оболочкой, поэтому программа env
никогда не видит переменную.
Вы можете создать дочернюю оболочку для проверки переменных; используйте кавычки, чтобы предотвратить оценку родительской оболочкой:
A=1 env -i sh -c 'echo $A' # prints nothing
A=1 env sh -c 'echo $A' # prints 1
A=1 env printenv A # prints 1
ПУТЬ особенный. Даже если вы удалите его из своей среды, ваша оболочка, вероятно, определит запасной путь. Этот не экспортируется в дочерние процессы, а отображается только как переменная оболочки.
env -i printenv PATH # prints nothing, PATH is no longer exported
env -i sh -c 'echo $PATH' # prints something like /sbin:/bin