![Systemd.service:使用 bash 函数的输出来设置网络](https://linux22.com/image/76646/Systemd.service%EF%BC%9A%E4%BD%BF%E7%94%A8%20bash%20%E5%87%BD%E6%95%B0%E7%9A%84%E8%BE%93%E5%87%BA%E6%9D%A5%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C.png)
我尝试编写一个服务来设置网络接口。
在 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'