Fungsi kembali, tetapi substitusi perintah blok, karena Anda membuat pekerjaan latar belakang, tetapi Anda masih memiliki stdout Anda dibuka. Tutup saja dengan menambahkan >/dev/null
sebelum &
.
#!/bin/bash
function start {
leafpad >/dev/null &
echo $!
}
PID=$(start)
echo "PID is $PID"
Jika Anda ingin proses Anda juga memiliki stdin, stdout, stderr ditutup, gunakan ini:
leafpad >/dev/null 0>&1 2>&1 &
Ini akan menutup stdin (0), stdout (1), dan stderr (2), lalu latar belakang (&). Juga, ketika menggunakan pengalihan aliran ini jangan lupa mereka "ditipu", itu berarti digandakan dalam urutan eksekusi.
1>/dev/null 2>&1
dan
2>&1 1>/dev/null
tidak sama ! Di yang pertama, Anda menduplikasi aliran ke / dev / null (yang Anda inginkan), di yang terakhir, Anda menduplikasi / dev / stdout ke stderr, dan kemudian, menutup stdout. Jadi setiap pesan yang dikirim ke stderr
akan muncul di konsol Anda.
n>&-
dimanan
deskriptor file./dev/null
tidak akan menyebabkan kesalahan i / o ketika suatu proses mencoba untuk menulis stdout-nya, tetapi menemukan bahwa itu1
adalah FD yang tidak valid. Jadi terminologi dalam posting salah, bukan pemrograman bash yang sebenarnya. (Sebenarnya, menduplikasi FD 1 ke 0 berarti stdin akan menjadi file-descriptor yang dibukaO_RDONLY
, yang mungkin akan memberikan kesalahan (daripada no-bytes yang diinginkan tersedia) ketika proses mencoba membaca.) Miswc >/dev/null 0>&1
->wc: standard input: Bad file descriptor
exec <&- >&- <>/dev/null >&0
menangani stdin / out cukup lengkap. Itu membuat perbedaanzsh
setidaknya yang akan mengurutkan semua terbuka pada deskriptor yang sama secara otomatis ketika multios diatur.