Пытаюсь написать сервис для настройки сетевого интерфейса.
В 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'