Systemd.service: использование вывода функции bash для настройки сети

Systemd.service: использование вывода функции bash для настройки сети

Пытаюсь написать сервис для настройки сетевого интерфейса.
В Sysvinit использовал скрипт:

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

Теперь я хочу сделать это в Сервисе:

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

Это не работает. В systemctl status -l start-network.service написано:

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

Кто-нибудь знает, как использовать вывод функции в качестве переменной в systemd.service?

решение1

Обратите внимание, что Environment="var=$(cmd arg)"это на самом деле не оценивает $()часть. Переменная просто устанавливается в строку "$(cmd arg)".

Также, ExecStart=... $var ...заменит $varна строку, но также разделит полученную строку пробелами, так что вы фактически получите "$(cmd" и "arg)" в результате. Вам нужно использовать , ${var}чтобы избежать этого и сохранить строку как один аргумент.

Однако это не сработает, так как ничто не будет оценивать $(), поэтому вам нужно явно вызвать bash -cи передать всю команду как один аргумент, заключив ее в кавычки. Эти кавычки не похожи на кавычки bash и не останавливают расширение ${var}(хотя они останавливают расширение $var, если оно не само по себе). Итак, наконец, это должно сработать:

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

Связанный контент