Tento escrever um serviço para configurar a interface de rede.
No Sysvinit usei um script:
IP=$(fw_printenv -n ipaddr)
ifconfig eth0 $IP netmask 255.255.254.0 up
Agora quero fazer isso em um serviço:
[Service]
Type=oneshot
Environment="IP=$(/sbin/fw_printenv -n ipaddr)"
ExecStart=/sbin/ifconfig eth0 $IP netmask 255.255.255.0 up
Isso não funciona. Em systemctl status -l start-network.service diz:
Oct 23 06:17:29 lcd5a-dsp ifconfig[261]: ifconfig: invalid number 'sbin/fw_printenv'
Alguém sabe como usar a saída de uma função como variável em um systemd.service?
Responder1
Observe que isso Environment="var=$(cmd arg)"
não avalia realmente a $()
peça. A variável é apenas definida como a string "$(cmd arg)".
Além disso, ExecStart=... $var ...
substituirá $var
pela string, mas também dividirá a linha resultante em espaços, para que você obtenha efetivamente "$(cmd" e "arg)" no resultado. Você precisa usar ${var}
para evitar isso e manter a string como um argumento.
No entanto, isso não vai funcionar, pois nada avaliará o $()
, então você precisa chamar bash -c
e passar explicitamente o comando inteiro como um único argumento, colocando-o entre aspas. Essas aspas não são como aspas bash e não impedem a expansão de ${var}
(embora parem a expansão de $var se não estiver por conta própria). Então, finalmente, isso deve funcionar:
ExecStart=/bin/bash -c '/sbin/ifconfig eth0 ${IP} netmask 255.255.255.0 up'