GNU/Linux >> Belajar Linux >  >> Linux

Mengapa Skrip Bash Tidak Keluar Setelah Eksekusi?

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.


Linux
  1. Opsi Tidak Dikenal Rsync Dari Eksekusi Skrip Bash?

  2. Pipa ke/dari clipboard dalam skrip Bash

  3. Mengapa Anda perlu meletakkan #!/bin/bash di awal file skrip?

  1. Cara apa pun untuk keluar dari skrip bash, tetapi tidak keluar dari terminal

  2. Cara mendapatkan status keluar satu lingkaran di bash

  3. Bash:Mengapa skrip induk tidak berhenti di SIGINT saat skrip anak menjebak SIGINT?

  1. Apa arti set -e dalam skrip bash?

  2. Naikkan kesalahan dalam skrip Bash

  3. Apa yang dilakukan -e dalam bash shebang?