Mencegah bash agar tidak menampilkan "Selesai" ketika perintah latar belakang selesai dijalankan

34

Jika saya menjalankan perintah di latar belakang &, seperti ini:

sleep 2 &

ketika perintah selesai, saya mendapatkan "Selesai". Bagaimana saya bisa menghindari melihat pesan "Selesai"?

juanpablo
sumber

Jawaban:

34

Jalankan perintah dalam sebuah subkulit:

(sleep 2 &)
Wooble
sumber
harap dicatat bahwa dengan menggunakan ini, Anda kehilangan kendali atas pekerjaan di dalam shell penelepon (tidak jobsakan menunjukkan apa-apa).
mighq
36

Jalankan shell built-in:

$ set +m

Ini bekerja dengan mematikan "mode monitor" sehingga shell tidak melaporkan penghentian pekerjaan latar belakang.

Meskipun menjalankan perintah dalam subkulit seperti:

$ (sleep 2&)

... juga akan menonaktifkan pesan, satu-satunya alasan kerjanya adalah karena mode monitor diaktifkan secara default hanya untuk shell interaktif. Artinya, subshell menghindari pesan dengan menjalankan shell tambahan yang memiliki "set + m" otomatis.

DigitalRoss
sumber
4
Orang harus mencatat, bahwa output ini tidak dilakukan oleh tidur. Ini adalah bash shell yang baru saja memberi tahu Anda tentang pekerjaan latar belakang yang sudah selesai.
flolo
8

Saya ingin memperjelas dua jawaban sebelumnya. Jika yang Anda inginkan adalah untuk tidak pernah melihat pesan Selesai dari perintah apa pun di shell Anda, set +madalah cara untuk melakukannya. Masukkan saja ke dalam .profile dan / atau .bashrc Anda dan selesai. Perhatikan bahwa jika Anda mengetik ini:

set +m
sleep 2 &
set -m

dan tidur berakhir setelah final set -m, Anda masih akan mendapatkan pesan selesai.

Jika Anda ingin menonaktifkan pesan untuk permintaan perintah tunggal, teknik subkulit (sleep 2 &)adalah cara yang harus dilakukan.

Dalam semua kejujuran, saya hanya tahu tentang set +m, jadi +1 untuk Wooble untuk mencerahkan saya. Namun, perlu dicatat bahwa dari dua solusi yang Anda inginkan tergantung pada apa yang Anda coba lakukan.

andrewdski
sumber
0

Tanpa subkulit , Anda dapat melakukan hal berikut:

silent_background() {
    { 2>&3 "$@"& } 3>&2 2>-
    disown &>/dev/null  # Close STD{OUT,ERR} for silence if job has already completed
}

silent_background sleep 5

Berdasarkan jawaban ini .

Tom Hale
sumber