проблема экранирования bash при сохранении опций в переменной

Это работает для меня. Суть в том, чтобы добавить Userв Service, а также инициировать DISPLAYв Environment.

[Unit]
Description=launch chromium

[Service]
User=<user>
Environment=DISPLAY=:0
ExecStart=/usr/bin/chromium-browser

[Install]
WantedBy=user@.service
0
23.06.2021, 13:32
1 ответ

Чтобы интерпретатор оценивал шелл-код, хранящийся в переменной, вы должны использовать специальную встроенную команду eval. То же, что и в некоторых других языках :

.
cmd="--name=cloudflare-ddns \
--hostname=oznu-cloudflare-ddns \
--env=SUBDOMAIN=private \
--env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
--env=QEMU_ARCH=x86_64 \
--env=S6_KEEP_ENV=1 \
--env=S6_BEHAVIOUR_IF_STAGE2_FAILS=2 \
--env=CF_API=https://api.cloudflare.com/client/v4 \
--env=RRTYPE=A 
--env='CRON=*/5 *   *   *   *' --env=PROXIED=false \
--env=ZONE=thebiermans.net \
--env=API_KEY=kka \
--network=host \
--restart=always \
--log-driver=db --runtime=runc --detach=true -t oznu/cloudflare-ddns:latest"

eval "docker run $cmd"

Это предполагает конкатенацию "docker run "и содержимого $CMDв виде допустимого кода в синтаксисе оболочки. В этом случае интерпретация этого кода приведет к выполнению команды dockerсо списком аргументов.

Чтобы запустить команду со списком аргументов, хранящихся в переменной, вы должны использовать переменную-массив:

args=(
  --name=cloudflare-ddns
  --hostname=oznu-cloudflare-ddns
  --env=SUBDOMAIN=private
  --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  --env=QEMU_ARCH=x86_64
  --env=S6_KEEP_ENV=1
  --env=S6_BEHAVIOUR_IF_STAGE2_FAILS=2
  --env=CF_API=https://api.cloudflare.com/client/v4
  --env=RRTYPE=A
  --env='CRON=*/5 *   *   *   *'
  --env=PROXIED=false
  --env=ZONE=thebiermans.net
  --env=API_KEY=kka
  --network=host
  --restart=always
  --log-driver=db --runtime=runc --detach=true 
  -t oznu/cloudflare-ddns:latest
)

docker run "${args[@]}"

В любом случае, в bash не оставляйте расширения параметров без кавычек в контексте списка, так как это вряд ли когда-либо делает то, что вы хотите. Это делает оператор split+glob, который разбивает содержимое переменной на символы $IFS, а затем выполняет генерацию имени файла для каждого полученного слова. Это совершенно не связано с токенизацией синтаксиса оболочки и разбором синтаксиса, которые являются частями, которые, например, распознают и интерпретируют кавычки.

3
28.07.2021, 11:22

Теги

Похожие вопросы