Расширение происходит на исходной стороне пользователя, а не на стороне после sudo.
sudo -H -u user1 bash <<EOF
presentdir="$(pwd)"
echo "$presentdir"
EOF
Теперь после расширения это выглядит так:
sudo -H -u user1 bash <<EOF
presentdir="/home/orinal_user"
echo ""
EOF
т.е.оба расширения $presentdir
и $(pwd)
происходят на исходной стороне пользователя.
Таким образом, порядок:
- Сначала разверните все переменные в heredoc
<<EOF ... EOF
- Затем выполните
sudo bash
- Затем
sudo bash
снова расширит переменные (но ничего не останется).
Вы хотите:
- Запустить sudobash
- Затем разверните переменные
Вы должны решить, с какой стороны вы хотите, чтобы это расширение произошло.Лично я бы вообще не использовал для этого heredoc, а использовал бы опцию -c
, которая позволяет мне более явно контролировать цитирование:
sudo -H -u user1 bash -c 'presentdir="$(pwd)"; echo "$presentdir"'
выведет вывод $(pwd)
run после sudo -u user1
.
Или заключите в кавычки переменные:
sudo -H -u user1 bash <<EOF
presentdir="\"\$(pwd)\""
echo "\"\$presentdir\""
EOF
Первое расширение расширяется "\"\$var\""
в "$var"
, затем второе расширение на стороне sudo bash
расширяет "$var"
до его буквального значения.
Или вы можете поместить разделитель heredoc в кавычки ('
или "
не имеет значения)
sudo -H -u user1 bash <<"EOF"
presentdir="$(pwd)"
echo "$presentdir"
EOF
Это сделает этот heredocне расширен на исходной стороне пользователя (маленький и полезный трюк).