Почему не работают следующие способы сохранения переменных среды для sudo?

С https://stackoverflow.com/a/29400598/156458

Другие решения, которые я видел здесь до сих пор, основаны на некоторых системных определениях, но на самом деле возможно, чтобы sudo использовал текущий PATH (с командой env ) и / или остальную часть среды (с опцией -E ) просто вызвав это правильно:

 sudo -E env "PATH=$PATH"  [arguments] 

На самом деле из него можно сделать псевдоним:

 alias mysudo='sudo -E env "PATH=$PATH"' 

(Также можно назвать псевдоним sudo , заменив оригинальный sudo .)

При условии

-E, –preserve-env Указывает политике безопасности, что пользователь желает сохранить свои существующие переменные среды. Политика безопасности может возвращать ошибку, если у пользователя нет разрешения на сохранение среды.

Мне было интересно, почему следующее не работает

 sudo -E  [arguments] 

?

Учитывая, что "PATH=$PATH" [arguments] также является командой, мне было интересно, почему следующее не работает:

 sudo "PATH=$PATH"  [arguments] 

?

Благодарю.

 sudo -E  [arguments] 

не работает в вашем случае, потому что Debian определяет secure_path в /etc/defaults , который переопределяет значение PATH даже с -E .

 sudo "PATH=$PATH"  [arguments] 

должно работать, потому что PATH=$PATH распознается и обрабатывается sudo . В моем случае sudo "PATH=$PATH" env показывает мое текущее значение PATH . (Обратите внимание, что PATH=$PATH не является универсально признанной командой; она соответствует конструкции, которая распознается оболочкой и sudo , но не обязательно в других контекстах.).

Однако само sudo не использует этот $PATH для поиска и все еще использует secure_path .

 sudo -E env "PATH=$PATH"  [arguments] 

работает, потому что "PATH=$PATH" хранит текущее значение PATH в команде, как видно из sudo и затем env ; sudo заменяет значение PATH заданное для env в своей среде, но затем env считывает значение из своих аргументов, чтобы создать среду для .

И здесь команда env просматривается sudo в secure_path , но сама env ищет в предоставленном $PATH .