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á $var
por 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 -c
y 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'