ネットワークインターフェイスを設定するサービスを作成しようとしています。
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 ...
置き換えられますが、結果行をスペースに分割するため、結果に「$(cmd」と「arg)」が効果的に表示されます。これを防ぎ、文字列をパラメータとして保持するには、を$var
使用する必要があります。${var}
ただし、これは評価する項目がないため機能しないため、コマンド全体を引用符で囲んで単一の引数で明示的に呼び出して渡す必要があります$()
。bash -c
これらの引用符はbash引用符とは異なり、拡張を停止しません${var}
($ varが独立していない場合、拡張は停止しますが)。結局、次のように動作します。
ExecStart=/bin/bash -c '/sbin/ifconfig eth0 ${IP} netmask 255.255.255.0 up'