ネットワーク インターフェイスを設定するためのサービスを作成しようとしています。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}
これを回避するには、 を使用し、文字列を 1 つの引数として保持する必要があります。
ただし、 を評価するものが何もないので、これは機能しません。そのため、引用符で囲んで、コマンド全体を 1 つの引数として$()
明示的に呼び出して渡す必要があります。これらの引用符は bash の引用符とは異なり、 の展開を停止しません(ただし、$var が単独でない場合は、展開を停止します)。したがって、最終的には、これが機能するはずです。bash -c
${var}
ExecStart=/bin/bash -c '/sbin/ifconfig eth0 ${IP} netmask 255.255.255.0 up'