Mengapa menggunakan `bash -c` di supervisor alih-alih memanggil skrip secara langsung?

11

Saya mulai menggunakan supervisorduntuk mengontrol layanan di server saya. Saya bukan pengguna pro linux tetapi bisa bertahan dengan baik dan menjalankannya.

Hanya karena penasaran, saya perhatikan bahwa sebagian besar perintah di supervisord tampaknya disebut seperti:

[program:install]
command=bash -c "/src/etc/install.sh"

Saya sudah membaca bash's man, dan tahu itu -charus digunakan untuk memasukkan variabel yang dikirimkan setelah string.

Jadi apa gunanya menggunakan bash -cdi supervisor (atau tempat lain) daripada memanggil skrip secara langsung (seperti contoh di bawah), mengingat tidak ada variabel di mana berlalu / digunakan?

[program:install]
command=/src/etc/install.sh

Terima kasih!

Daniel Costa
sumber

Jawaban:

11

Shell fitur seperti perluasan pathname ( *, ?), daftar perintah ( ;, &&, ||), pengalihan ( <, >, |,) tidak dilaksanakan oleh supervisord bahwa hanya membagi perintah ke array dari string argumen.

The bash -cmungkin hanya bantuan untuk pemula pengguna yang mungkin akan tergoda untuk menggunakan fitur tersebut di perintah. Misalnya menghindari kejutan itu

command=echo foo > /tmp/bar

output foo > /tmp/barbukannya menulis fooke /tmp/bar.

-ctidak ada hubungannya dengan variabel. Argumen tambahan untuk bash hanya akan tersedia sebagai argumen naskah $0, $1, dll dalam perintah, tetapi fitur yang memiliki jarang digunakan apapun. Misalnya bash -c 'echo $0 $0' fookeluaran foo foo.

Marko Kohtala
sumber
1
Terima kasih, itu jawaban yang sangat pragmatis, dan itu mungkin akan menghemat banyak waktu. Saya, sebagai pengguna pemula, akan membuat kesalahan ini (dan tidak pernah memikirkan bash -csebagai solusi!).
Daniel Costa
6

Dijelaskan dalam dokumentasi :

Tidak ada shell yang dieksekusi oleh pengawas ketika menjalankan subproses, sehingga variabel lingkungan seperti USER, PATH, HOME, SHELL, LOGNAME, dll. Tidak diubah dari standarnya atau ditugaskan kembali. Ini sangat penting untuk dicatat ketika Anda menjalankan program dari pengawas yang dijalankan sebagai root dengan pengguna = bait dalam konfigurasi.

Untuk menyiasati masalah ini bash -cdapat digunakan.

Mark Wagner
sumber
2
Mark, terima kasih atas jawaban Anda tetapi saya pikir yang lain adalah skenario yang lebih masuk akal (sementara Anda tidak salah dengan saya, saya masih perlu memilih satu jawaban yang benar ..). Selain itu, saya juga membantu pengguna baru dengan poin lebih sedikit.
Daniel Costa