시스템 서비스 파일에서 bash 매개변수 확장이 작동하지 않는 이유는 무엇입니까?

시스템 서비스 파일에서 bash 매개변수 확장이 작동하지 않는 이유는 무엇입니까?

파일에서 설정할 때 systemd'를 사용하고 명령에 옵션을 추가하려고 합니다 . EnvironmentFile내 유닛 파일에는 다음이 있습니다.

ExecStart=/usr/bin/bash -c "echo ${PORT:+port is $PORT}"

서비스를 시작하면 아무 것도 울리지 않습니다.

다음은 예상대로 작동합니다.

ExecStart=/usr/bin/bash -c "echo port is $PORT"

이는 파일을 올바르게 읽었음을 의미합니다.

매개변수 대체는 명령줄에서도 작동합니다.

$ PORT=1234 bash -c 'echo ${PORT:+port is $PORT}'
port is 1234

내가 무엇을 놓치고 있나요?

답변1

systemd는 자체적으로 최소한의 쉘 스타일 명령줄 구문 분석을 수행합니다.콘텐츠 ExecStart=및 기타 매개변수. 이 간결한 구문 분석은 기본 환경 변수 대체를 지원하지만 분명히 그렇지 않습니다 ${PORT:+port is $PORT}.

systemd가 이 작업을 수행하는 것을 방지하고 호출 셸이 이를 처리하도록 할 수 있습니다.

문서에서:

리터럴 달러 기호를 전달하려면 " $$"를 사용하십시오.

그러니 이것을 시도해 보세요:

ExecStart=/usr/bin/bash -c "echo $${PORT:+port is $$PORT}"

아니면 다음을 시도해 보세요.

ExecStart=/bin/sh -c "echo $${PORT:+port is $$PORT}"

여기서 수행하는 변수 확장 유형은 bash-ism이 아닌 POSIX 표준이기 때문입니다. /bin/sh대신 를 사용하면 bash에 대한 불필요한 의존성을 제거할 수 있습니다 bash.

관련 정보