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