파일에서 설정할 때 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
.