systemd 환경 파일의 중첩 변수

systemd 환경 파일의 중첩 변수
#File: /home/miles/temp/foo.env

ONE=/one
TWO=${ONE}/two
FULL_PATH=${TWO}/three
#File: ~/.config/systemd/user/foo.service

[Service]
EnvironmentFile=/home/miles/temp/foo.env

# prints ${TWO}/three
# ExecStart=/bin/sh -c 'echo $FULL_PATH'

# prints ${ONE}/two/three
ExecStart=/bin/sh -c 'echo ${FULL_PATH}'
  1. 임의의 중첩 수준으로 변수를 확장하는 방법이 있습니까?

    확장만 가능할 것 같습니다.깊은.

    관련된:환경 파일에서 2단계 대체를 수행하는 방법.

  2. 변수 주위에 중괄호를 추가하면 FULL_PATH한 수준 더 확장되는 이유는 무엇입니까?

    이 경우 중괄호가 선택 사항이었으면 좋겠습니다.

    확장할 매개변수 이름이나 기호는 중괄호로 묶을 수 있습니다. 이는 선택 사항이지만 이름의 일부로 해석될 수 있는 바로 다음 문자로부터 확장되는 변수를 보호하는 데 사용됩니다.

    https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

    systemd에서는 중괄호가 공백에서 단어가 분리되는 것을 방지하기 위한 것으로 보이지만 이는 이 경우에는 중요하지 않습니다.

    명령줄에서 단어의 일부로 사용되거나 "${FOO}"자체 단어로 사용되는 경우, 제거되고 환경 변수(있는 경우)(포함된 공백 포함)의 정확한 값으로 대체됩니다. 이는 항상 결과입니다. 정확히 하나의 매개변수로. 명령줄에서 "$FOO"별도의 단어 로 사용됩니다. 이 경우 공백에서 분할된 환경 변수의 값으로 대체됩니다.

    https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html#Command%20lines

답변1

여기서 핵심 사항은 약간 미묘하지만 인용한 문서에 나와 있습니다.

사용" ${FOO}"단어의 일부로, 또는 그 자체의 단어로,

사용" $FOO"별도의 단어로

$FOO단독으로 단어로 사용될 때만 확장되지만,인용된 문자열 전체는 한 단어입니다.이므로 해당 $FOO문자열 $FOO'$FOO'.​ 중괄호를 사용하는 경우 다른 텍스트가 포함된 따옴표 붙은 문자열 내에서만 확장이 발생합니다 ."$FOO""something $FOO"${FOO}

/bin/sh -c 'echo ${TWO}/three'따라서 여러분이 보고 있는 ${FULL_PATH}것은 ./bin/sh -c 'echo $FULL_PATH'$FULL_PATH

두 경우 모두 재귀 변수 확장을 수행하는 구성 요소가 없습니다. 한 경우에는 systemd ${FULL_PATH}가 로 대체되고 ${TWO}/three셸이 확장됩니다 ${TWO}. 두 번째 경우에는 대체 없이 systemd가 대체되고 셸이 확장됩니다 $FULL_PATH. 변수를 재귀적으로 안전하게 확장하는 방법을 모르겠습니다.

관련 정보