systemd를 통해 서브쉘을 명령줄 인수로 사용하여 쉘 스크립트를 실행하는 방법

systemd를 통해 서브쉘을 명령줄 인수로 사용하여 쉘 스크립트를 실행하는 방법

다른 쉘 스크립트의 출력으로 표시되는 명령줄 인수를 허용하는 쉘 스크립트가 있습니다. 즉:

myscript1.sh -opt `myscript2.sh` 

systemd를 통해 이 스크립트를 시작해야 합니다.

.service 파일에 이 지시문을 추가해 보았습니다.

...
[Service]
...
ExecStart=/bin/bash -c "myscript1.sh -opt `myscript2.sh`"
...

그리고 솔루션은 실제로 작동합니다.

myscript1.sh내 질문은: 명령을 사용하지 않고 스크립트를 직접 시작할 수 있습니까 /bin/bash?

답변1

문서부터 시작하세요.man systemd.service

ExecStart=이 서비스를 시작할 때 실행할 매개변수가 포함된 명령입니다. 값은 아래 설명된 규칙에 따라 0개 이상의 명령줄로 분할됩니다(아래 "명령줄" 섹션 참조).

그런 다음 상호 참조를 따르십시오.

명령줄이 섹션에서는 ExecStart=[...and other...] 옵션에 대한 명령줄 구문 분석과 변수 및 지정자 대체에 대해 설명합니다.

여러 명령줄을 세미콜론으로 구분하여 단일 명령으로 연결할 수 있습니다. 이러한 세미콜론은 별도의 단어로 전달되어야 합니다. 단일 세미콜론은 ";"으로 이스케이프할 수 있습니다.

[…]

이 구문은 쉘 구문에서 영감을 받았습니다., 그러나 다음 단락에 설명된 메타 문자 및 확장만 이해합니다. 변수의 확장은 다릅니다.특히 <, <<>, >>사용된 파이프 |, 사용된 데몬 및 기타 셸 구문 요소를 사용한 리디렉션은 지원되지 않습니다.&

ExecStart=따라서 이 옵션은 셸에 의해 구문 분석되는 것이 아니라 매우 제한된 셸 코드 하위 집합을 구현하는 프로세스에 의해 구문 분석된다는 것이 분명합니다 .

나는 더 간단한 셸과 백틱을 보다 현대적으로 대체하는 코드를 변형하여 사용할 것입니다.

ExecStart=/bin/sh -c 'myscript1.sh -opt $(myscript2.sh)'

관련 정보