Saya mengkompilasi bash one-liner pendek untuk memfokuskan aplikasi yang sedang berjalan atau meluncurkannya jika tidak berjalan:
#!/bin/bash
#intellilaunch.sh
wmctrl -a $1 || $1 & disown
exit 1
Perintah keluar dengan baik ketika dijalankan langsung dari baris perintah:
:~$ wmctrl -a firefox || firefox & disown
[1] 32505
Pemeriksaan cepat dengan monitor sistem menunjukkan bahwa hanya firefox yang berjalan.
Namun, ketika saya meluncurkan firefox melalui skrip (./intellilaunch.sh firefox
) itu memunculkan proses baru yang disebut intellilaunch.sh firefox
, yang hanya keluar setelah menutup firefox.
Apa yang saya lakukan salah?
Sunting :
Saya memodifikasi skrip saya sesuai dengan saran michas:
#!/bin/bash
program=$(basename $1)
if ! wmctrl -a "$program"; then
"$1"&
fi
Bukan one-liner lagi tetapi sekarang berfungsi dengan baik!
Jawaban yang Diterima:
Saya tidak dapat mereproduksi perilaku ini di sistem saya. Dari deskripsi Anda terdengar seperti ada proses yang tidak disetel dengan benar ke latar belakang.
Coba jalankan sebagai bash -x intellilaunch.sh xclock
, ini akan menunjukkan, apa yang sedang terjadi.
Juga ||
mengikat lebih kuat dari &
, oleh karena itu Anda mengirim seluruh pipa di latar belakang. Mungkin if
explicit eksplisit akan menjadi ide yang bagus.
Anda
wmctrl -a firefox || firefox & disown ; exit 1
diartikan sebagai
( wmctrl -a firefox || firefox ) & disown ; exit 1
padahal maksudmu mungkin
wmctrl -a firefox || ( firefox & disown ) ; exit 1
Karena itu, bash akan memulai dua pekerjaan satu dengan wmctl dan firefox – dan satu lagi dengan disown dan exit. Karena pekerjaan latar belakang membutuhkan waktu yang singkat untuk diluncurkan, itu mungkin akan memulai perintah sedikit kemudian, itulah sebabnya output dari bash -x
tampaknya berada dalam urutan yang salah.