Systemd.service: Use a saída de uma função bash para configurar a rede

Systemd.service: Use a saída de uma função bash para configurar a rede

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á $varpela 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 -ce 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'

informação relacionada