Systemd.service: bash関数の出力を使用してネットワークを設定する

Systemd.service: bash関数の出力を使用してネットワークを設定する

ネットワーク インターフェイスを設定するためのサービスを作成しようとしています。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'

関連情報