С 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
.