Systemd.service: Verwenden Sie die Ausgabe einer Bash-Funktion, um das Netzwerk einzurichten

Systemd.service: Verwenden Sie die Ausgabe einer Bash-Funktion, um das Netzwerk einzurichten

Ich versuche einen Dienst zu schreiben, der die Netzwerkschnittstelle einrichtet.
In Sysvinit habe ich ein Skript verwendet:

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

Nun möchte ich dies in einem Service tun:

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

Das funktioniert nicht. In systemctl status -l start-network.service steht:

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

Weiß jemand, wie man die Ausgabe einer Funktion als Variable in einem systemd.service verwendet?

Antwort1

Beachten Sie, dass Environment="var=$(cmd arg)"der Teil nicht wirklich ausgewertet wird $(). Die Variable wird einfach auf die Zeichenfolge „$(cmd arg)“ gesetzt.

Außerdem ExecStart=... $var ...wird es $vardurch die Zeichenfolge ersetzt, die resultierende Zeile wird jedoch auch an Leerzeichen aufgeteilt, sodass Sie im Ergebnis tatsächlich „$(cmd) und „arg)“ erhalten. Sie müssen verwenden, ${var}um dies zu vermeiden und die Zeichenfolge als ein Argument beizubehalten.

Dies funktioniert jedoch nicht, da nichts das auswertet. $()Sie müssen also bash -cden gesamten Befehl explizit aufrufen und als einzelnes Argument übergeben, indem Sie ihn in Anführungszeichen setzen. Diese Anführungszeichen sind nicht wie Bash-Anführungszeichen und verhindern nicht die Erweiterung von ${var}(sie verhindern jedoch die Erweiterung von $var, wenn es nicht allein steht). Das sollte also letztendlich funktionieren:

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

verwandte Informationen