Systemd.service: utilice la salida de una función bash para configurar la red

Systemd.service: utilice la salida de una función bash para configurar la red

Intento escribir un servicio para configurar la interfaz de red.
En Sysvinit utilicé un script:

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

Ahora quiero hacer esto en un Servicio:

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

Esto no funciona. En systemctl status -l start-network.service dice:

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

¿Alguien sabe cómo utilizar la salida de una función como variable en systemd.service?

Respuesta1

Tenga en cuenta que Environment="var=$(cmd arg)"en realidad no evalúa la $()pieza. La variable simplemente se establece en la cadena "$(cmd arg)".

Además, ExecStart=... $var ...reemplazará $varpor la cadena, pero también dividirá la línea resultante en espacios, por lo que efectivamente obtendrá "$(cmd" y "arg)" en el resultado. Debe usarlo ${var}para evitar esto y mantener la cadena como un argumento.

Sin embargo, esto no funcionará, ya que nada evaluará el comando $(), por lo que debe llamar bash -cy pasar explícitamente todo el comando como un argumento único encerrándolo entre comillas. Estas comillas no son como las comillas de bash y no detienen la expansión de ${var}(aunque sí detiene la expansión de $var si no es por sí sola). Finalmente, esto debería funcionar:

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

información relacionada