Neden bash parametre genişletmesi systemd hizmet dosyalarının içinde çalışmıyor?


14

systemd'S kullanmaya çalışıyorum EnvironmentFileve dosya ayarlandığında komuta bir seçenek eklemek. Birim dosyasında aşağıdakiler var:

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

hizmete başladığımda hiçbir şey yankılanmıyor.

Beklendiği gibi aşağıdakiler çalışır:

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

bu da dosyanın doğru okunduğu anlamına gelir.

Parametre değiştirme komut satırında da çalışır:

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

Neyi kaçırıyorum?

Yanıtlar:


27

systemd içeriğinin ExecStart=ve diğer parametrelerin kendi minimalist kabuk stili komut satırı ayrıştırmasını yapar . Bu minimalist ayrıştırma, temel ortam değişkeni ikamesini destekler, ancak görünüşe göre böyle şeyleri desteklemez ${PORT:+port is $PORT}.

Systemd'in bunu yapmasını önlemek ve çağrılan kabuğun işlemesini sağlayın.

Belgelerden:

Gerçek bir dolar işareti geçmek için " $$" kullanın .

Bu yüzden şunu deneyin:

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

Ya da daha iyisi, şunu deneyin:

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

çünkü burada yaptığınız değişken genişletme türü POSIX standardıdır ve bash-ism değildir. Bunun /bin/shyerine kullanarak bashgereksiz bir bağımlılığı kaldıracaksınız bash.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.