我嘗試編寫一個服務來設定網路介面。
在 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'