Mengapa ekspansi parameter bash tidak berfungsi di dalam file layanan systemd?

14

Saya mencoba untuk menggunakan systemd's EnvironmentFiledan menambahkan opsi untuk perintah ketika diatur dalam file. Saya memiliki yang berikut ini di file unit:

ExecStart=/usr/bin/bash -c "echo ${PORT:+port is $PORT}"

yang tidak menggemakan apa pun ketika saya memulai layanan.

Berikut ini berfungsi seperti yang diharapkan:

ExecStart=/usr/bin/bash -c "echo port is $PORT"

yang berarti file tersebut dibaca dengan benar.

Substitusi parameter juga berfungsi pada baris perintah:

$ PORT=1234 bash -c 'echo ${PORT:+port is $PORT}'
port is 1234

Apa yang saya lewatkan?

Lev Levitsky
sumber

Jawaban:

27

systemd melakukan penguraian baris perintah shell-style minimalis dari konten ExecStart=dan parameter lainnya. Penguraian minimalis ini mendukung substitusi variabel lingkungan dasar tetapi tampaknya bukan hal-hal seperti ${PORT:+port is $PORT}.

Anda akan ingin mencegah systemd melakukan itu dan membiarkan shell yang dipanggil menanganinya.

Dari dokumentasi:

Untuk melewati tanda dolar literal, gunakan " $$".

Jadi coba ini:

ExecStart=/usr/bin/bash -c "echo $${PORT:+port is $$PORT}"

Atau lebih baik lagi, coba ini:

ExecStart=/bin/sh -c "echo $${PORT:+port is $$PORT}"

karena jenis ekspansi variabel yang Anda lakukan di sini adalah standar POSIX dan bukan bash-isme. Dengan menggunakan /bin/shalih-alih, bashAnda akan menghapus ketergantungan yang tidak perlu bash.

Celada
sumber