Если установлена переменная HOME
, ~
в вашем примере расширяется в соответствии с переменной. Обычно переменная экспортируется в среду.
От man 8 sudo
:
-E
Опция -E
(сохранить среду) указывает политике безопасности, что пользователь желает сохранить свои существующие переменные среды. Политика безопасности может возвращать ошибку, если указана опция -E
и у пользователя нет прав на сохранение среды.
Таким образом, sudo -E your_script
- это способ добавить ~/.bashrc
в сценарий к /home/actual_user/.bashrc
. Обратите внимание, что переменные окружения, кроме HOME
, также будут сохранены.
В качестве альтернативы вы можете сохранить только эту одну переменную с
sudo HOME="$HOME" your_script
Это работает "из коробки" в моем Debian, но, пожалуйста, посмотрите man 8 sudo
и man 5 sudoers
чтобы узнать, как можно ограничивать переменные.
Другой вариант - установить переменную в начале вашего скрипта. Его значение может быть жестко задано или передано в качестве аргумента командной строки.
Имейте в виду, что запуск всего скрипта с помощью sudo
имеет недостатки:
- Любая ошибка будет кусать вас с повышенными правами.
- Если вашему сценарию необходимо знать
$HOME
фактического пользователя для создания в нем файлов или каталогов, то созданные объекты будут принадлежать пользователю root. Это может стать проблемой позже, когда вы захотите использовать их без sudo
. Общая предпосылка - все в вашем домашнем каталоге принадлежит вам (возможные исключения, ну, в общем, исключения).
Возможно, вы можете изолировать повышенную часть сценария, чтобы он полностью выполнялся после однократного ввода пароля, а затем возвращается к родительскому сценарию без повышенных прав, чтобы искажать с помощью /home/actual_user
. Как это:
#!/bin/bash
foo1 # runs normally
sudo bash <<EOF
bar1 # runs as if with sudo
bar2 # runs as if with sudo
EOF
foo2 # runs normally