Systemd.service: bash 기능의 출력을 사용하여 네트워크 설정

Systemd.service: bash 기능의 출력을 사용하여 네트워크 설정

네트워크 인터페이스를 설정하는 서비스를 작성하려고 합니다.
Sysvinit에서는 다음 스크립트를 사용했습니다.

IP=$(fw_printenv -n ipaddr)
ifconfig eth0 $IP netmask 255.255.254.0 up

이제 서비스에서 이 작업을 수행하고 싶습니다.

[Service]
Type=oneshot
Environment="IP=$(/sbin/fw_printenv -n ipaddr)"
ExecStart=/sbin/ifconfig eth0 $IP netmask 255.255.255.0 up

이것은 작동하지 않습니다. systemctl status -l start-network.service에는 다음과 같이 표시됩니다.

Oct 23 06:17:29 lcd5a-dsp ifconfig[261]: ifconfig: invalid number 'sbin/fw_printenv'

systemd.service에서 함수의 출력을 변수로 사용하는 방법을 아는 사람이 있나요?

답변1

Environment="var=$(cmd arg)"실제로 부품을 평가하지는 않습니다 $(). 변수는 "$(cmd arg)" 문자열로 설정됩니다.

또한 문자열로 ExecStart=... $var ...대체되지만 결과 줄을 공백으로 분할하므로 결과에 "$(cmd" 및 "arg)"가 효과적으로 표시됩니다. 이를 방지하고 문자열을 하나의 인수로 유지하려면 $var사용해야 합니다 .${var}

그러나 아무것도 평가하지 않기 때문에 이것은 작동하지 않을 것입니다. 따라서 전체 명령을 따옴표로 묶어 $()명시적으로 단일 인수로 호출하고 전달해야 합니다 . bash -c이러한 인용문은 bash 인용문과 같지 않으며 확장을 중지하지 않습니다 ${var}(비록 $var 자체가 아닌 경우 확장을 중지하지만). 그러면 마지막으로 다음과 같이 작동합니다.

ExecStart=/bin/bash -c '/sbin/ifconfig eth0 ${IP} netmask 255.255.255.0 up'

관련 정보