#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}'
임의의 중첩 수준으로 변수를 확장하는 방법이 있습니까?
확장만 가능할 것 같습니다.둘깊은.
변수 주위에 중괄호를 추가하면
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
. 변수를 재귀적으로 안전하게 확장하는 방법을 모르겠습니다.