왜 bash 매개 변수 확장이 시스템 서비스 파일에서 작동하지 않습니까? 할 수 있습니다. 단위 파일에 다음이 있습니다. ExecStart=/usr/bin/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

내가 무엇을 놓치고 있습니까?



답변

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.