Saya ingin tahu apakah ada cara untuk meletakkan ampersand dalam variabel dan masih menggunakannya untuk mengirim proses ke latar belakang.
Ini bekerja:
BCKGRND=yes
if [ "$BCKGRND" = "yes" ]; then
sleep 5 &
else
sleep 5
fi
Tapi bukankah itu keren untuk mencapai lima baris hanya dengan satu? Seperti itu:
BCKGRND='&'
sleep 5 ${BCKGRND}
Tapi itu tidak berhasil. Jika BCKGRND tidak disetel berfungsi - tetapi ketika disetel itu diartikan sebagai '&' literal dan keluar kesalahan.
bash
shell-script
variable
background-process
BrowncoatOkie
sumber
sumber
echo $!
mengembalikan PIDJawaban:
Itu tidak mungkin untuk menggunakan variabel untuk latar belakang panggilan karena ekspansi variabel terjadi setelah baris perintah diuraikan untuk operator kontrol (seperti
&&
dan&
).Namun pilihan lain adalah untuk membungkus panggilan dalam suatu fungsi:
... lalu atur variabel sesuai kebutuhan:
sumber
ed
? +1, ini adalah solusi terbersih.Anda dapat membalik hal-hal dan membuat variasi "foregrounding":
Setel
FOREGROUND
ketrue
atau kosongkan untuk menjalankan proses di latar belakang. (PengaturanFOREGROUND
untuktrue
berjalan di latar belakang memang membingungkan! Nama variabel yang tepat dibiarkan sebagai latihan untuk pembaca.)sumber
set -m
digunakan).Anda mungkin harus menggunakan
eval
:eval
menyebabkan shell mengevaluasi kembali argumen yang diberikan.&
Karena itu literal akan ditafsirkan sebagai&
di akhir perintah dan bukan sebagai argumen untuk perintah, menempatkan perintah di latar belakang.sumber
eval
harus mengandung peringatan, bahwa ini harus ditangani dengan hati-hati. Lihat misalnya jawaban ini ."$BCKGRND"
mengevaluasi ke argumen kosong.eval
akan bergabung dengan argumennya dengan spasi sebelum melakukan eval yang sebenarnya. Coba saja:eval printf "'{%s}\n'" foo "" "" ""
.eval foo "" "" "" ""
sangat mirip denganeval foo
, tidak peduli apaIFS
atau hal lainnya.eval 'sleep $TIMEOUT' "$BACKGROUND"
. Kalau tidak, Anda bisa mendapatkan ekspansi ganda jika variabel diperluas ke variabel lain atau berisi karakter khusus. Juga, kutipan bersarang bisa menjadi rumit.