변수에 옵션을 저장할 때 bash 이스케이프 문제

변수에 옵션을 저장할 때 bash 이스케이프 문제

변수에 문자열이 저장되어 있습니다. 이게 내가 원하는 결과야...

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"

실행할 수 있도록 변수에 어떻게 저장합니까?

예를 들어

docker run $CMD

여기에 올바른 이스케이프 세트가 누락되어 잘못된 출력이 나타납니다.

답변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에서는 목록 컨텍스트에 인용되지 않은 매개변수 확장을 두지 마십시오. 이렇게 하면 원하는 효과를 거의 얻을 수 없습니다. 이를 수행하는 것은 변수의 내용을 문자로 분할한 $IFS다음 각 결과 단어에 대해 파일 이름 생성을 수행하는 분할+글로브 연산자입니다. 이는 쉘 구문 토큰화 및 구문 구문 분석과 전혀 관련이 없습니다.예를 들어, 인용된 부분을 식별하고 해석합니다.

관련 정보