我尝试编写一个服务来设置网络接口。
在 Sysvinit 中,我使用了一个脚本:
IP=$(fw_printenv -n ipaddr)
ifconfig eth0 $IP netmask 255.255.254.0 up
Run Code Online (Sandbox Code Playgroud)
现在我想在服务中做到这一点:
[Service]
Type=oneshot
Environment="IP=$(/sbin/fw_printenv -n ipaddr)"
ExecStart=/sbin/ifconfig eth0 $IP netmask 255.255.255.0 up
Run Code Online (Sandbox Code Playgroud)
这不起作用。在 systemctl status -l start-network.service 它说:
Oct 23 06:17:29 lcd5a-dsp ifconfig[261]: ifconfig: invalid number 'sbin/fw_printenv'
Run Code Online (Sandbox Code Playgroud)
有人知道如何将函数的输出用作 systemd.service 中的变量吗?
请注意,Environment="var=$(cmd arg)"
它实际上并不评估$()
零件。该变量只是设置为字符串“$(cmd arg)”。
此外,ExecStart=... $var ...
将替换$var
为字符串,但也会在空格上拆分结果行,因此您将有效地在结果中获得 "$(cmd" 和 "arg)"。您需要使用${var}
来避免这种情况并将字符串保留为一个参数。
但是,这不会起作用,因为没有任何东西会评估$()
,因此您需要bash -c
通过将其括在引号中来显式调用整个命令并将其作为单个 arg 传递。这些引号不像 bash 引号,并且不会停止扩展${var}
(尽管它会停止 $var 扩展,如果它不是独立的)。所以最后,这应该有效:
ExecStart=/bin/bash -c '/sbin/ifconfig eth0 ${IP} netmask 255.255.255.0 up'
Run Code Online (Sandbox Code Playgroud)