내가 사용하려고하고 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
내가 무엇을 놓치고 있습니까?
답변
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}"
여기서 수행하는 변수 확장 유형은 POSIX 표준이며 bash-ism이 아니기 때문입니다. /bin/sh
대신에 bash
를 사용 하면에 대한 불필요한 종속성이 제거됩니다 bash
.