1

У меня есть эта команда (user - это имя моей учетной записи: echo $ USER):

sudo -H -u user bash -c 'DISPLAY=:0 /usr/bin/dbus-launch /home/user/myappimage start -i &'

Отлично работает Теперь я хочу создать некоторые переменные, чтобы заменить мои user и path appimage:

myuser="user"
pathappimage="/home/$myuser/myappimage"
sudo -H -u $myuser bash -c 'DISPLAY=:0 /usr/bin/dbus-launch $pathappimage start -i &'

Проблема в том, что переменная $pathappimage не распознает ее из-за одинарных кавычек в команде.

Как я могу это исправить?

1 ответ1

0

Вероятно, двойные кавычки подойдут:

sudo -H -u $myuser bash -c "DISPLAY=:0 /usr/bin/dbus-launch $pathappimage start -i &"

или если ваш $pathappimage может содержать пробелы и т.д .:

… "DISPLAY=:0 /usr/bin/dbus-launch \"$pathappimage\" start -i &"
                                   ^^             ^^
# these double quotes are escaped and they will remain

Если вам нужны одинарные кавычки по причине, вы можете изменить тип кавычек, например:

sudo -H -u $myuser bash -c 'DISPLAY=:0 /usr/bin/dbus-launch '"$pathappimage"' start -i &'
#                          ^---- this is still treated as a single argument to bash ----^

$pathappimage будет расширен текущей оболочкой до запуска bash . Если вы хотите, чтобы bash видел результат в двойных кавычках, если у вас есть пробелы или что-то в $pathappimage , то вызовите так:

… 'DISPLAY=:0 /usr/bin/dbus-launch "'"$pathappimage"'" start -i &'
#                                  ^                 ^
# these double quotes are in single quotes and they will remain

или даже в кавычках:

… 'DISPLAY=:0 /usr/bin/dbus-launch '\'"$pathappimage"\'' start -i &'
#                                   ^^               ^^
# these single quotes are escaped and they will remain

Другой (низший) подход. Вы можете export переменную, передать всю строку в одинарных кавычках, а затем отменить экспорт при необходимости:

export pathappimage
bash -c 'DISPLAY=:0 /usr/bin/dbus-launch "$pathappimage" start -i &'
# bash will see the whole single-quoted string literally
export -n pathappimage

Теперь bash вы вызываете, расширит $pathappimage , эта переменная будет в его окружении. Однако sudo не сохранит среду, если вы не используете sudo --preserve-env , что может быть не тем, что вы хотите или можете сделать. Из-за этого умное цитирование лучше и, вероятно, безопаснее.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .