네트워크 인터페이스를 설정하는 서비스를 작성하려고 합니다.
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'